是否可以将"delete"放在逗号表达式中



我想在指针引用的结构体中返回一些材料,然后删除结构体。

在Java中,只要返回该值,垃圾回收系统就会自动删除该结构体。

但是在c++中,我可以想象的方式不是很干净,使用一个临时变量来存储要返回的东西,删除指针,然后返回存储的值。

我尝试了另一种棘手的方法,使用逗号表达式作为"return ptr->value, delete ptr ",但是有一个编译错误说&;void值没有被忽略,因为它应该"。

是否有可能更优雅地实现这一点?

谢谢你。


更新

非常感谢大家的建议。事实上,我的问题的最初动机是关于逗号表达式,我想使用一些较短的代码。我发现讨论更多的是关于c++中指针的用法。这也是另一个非常有趣的话题。

我已经使用C多年了,所以我对原始指针更熟悉,对智能指针的经验很少。在我的第一个想法,有两个基本的条件,我们需要指针。一种是引用在堆中分配的大块内存,另一种是动态分配,如链表节点或树节点(例如。我最初的问题是在编写类似bst的结构体时出现的)。

所以在c++编程中,智能指针是两种情况下的最佳选择吗?如果我们考虑效率,例如在一些低级库上工作,是否有可能将原始指针完全封装在类中以减少内存泄漏风险?

当然。不要使用指针,如果必须的话,使用智能指针(std::shared_ptr, std::unique_ptr)。

在您的情况下,它可以像

一样简单
//...
return obj.value;  //no pointer needed
                   //automatic memory management

//...
return smartPtr->value;  //smart pointer automatically cleans up after itself

您可能无法想象在c++中用干净的方式来完成它,因为c++是作为C来教授的,存在指针和内存管理问题。正确的c++使用RAII,不会受到这个问题的困扰。

不,在您的情况下,因为函数应该返回一些值,但是逗号操作符计算到最右边的操作数,在您的情况下是delete表达式,这只是void

通常的解决方案是,首先,不使用指针,以便有没有什么可以删除的,其次,当有其他资源时要被清理,在析构函数中进行清理,这将在返回语句复制后自动调用将返回值复制到需要复制的位置。

如果你可以返回它,你就可以复制它,所以它不应该是动态分配,最明显的例外是涉及多态对象;多态性需要指针或者提到工作,大多数时候(尽管有)异常),多态对象将是动态的分配。在这种情况下,如果的实际生命周期多态对象对应局部作用域,可以使用std::auto_ptr(或std::unique_ptr在不太可能的情况下)

如果在函数内部动态分配指针。你可以做的是:

考虑您想返回一个int变量

int foo()
{
  MyStruct *obj;
  obj=new MyStruct;
  .....
  int x=obj->value;
  delete obj;
  return x;
}

或者你也可以这样:

int foo()
{
  MyStruct obj;
  obj=new MyStruct;
  .....
  return obj.value;
}
这样你就不用担心内存泄漏了。这是最简单的方法。当然,你可以使用智能指针。但是对于你的水平,我会建议你继续使用这个方法

相关内容

  • 没有找到相关文章

最新更新