是否可以在逗号表达式中添加“删除”

时间:2012-12-30 14:27:22

标签: c++ c comma

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

在Java中,只返回值,垃圾收集系统将自动删除结构。

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

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

有没有办法更优雅地实现这一目标?

非常感谢。


更新

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

我已经使用了C多年,所以我对原始指针更熟悉,并且对智能指针几乎没有经验。我首先想到的是,我们需要指针的基本条件有两个。一个是引用堆中分配的大块内存,另一个是动态分配,例如链接列表节点或树节点(例如,在编写类似BST的结构时出现了我的原始问题)。

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

4 个答案:

答案 0 :(得分:4)

不确定。不要使用指针,如果必须,请使用智能指针(std::shared_ptrstd::unique_ptr)。

在您的情况下,它可以像

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

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

你可能无法想象 clean 在C ++中这样做的方式,因为C ++被教导为C,带有指针和内存管理问题。正确的C ++使用 RAII 并且不会受此影响。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

如果你可以退货,你可以复制它,所以它不应该 动态分配,最值得注意的例外是哪里 涉及多态对象;多态性需要指针 或者提到工作,大多数时候(虽然有 异常),多态对象将是动态的 分配。在这种情况下,如果实际的寿命 多态对象对应本地范围,可以使用 std::auto_ptr(或std::unique_ptr,在不太​​可能的情况下 你可以信赖C ++ 11)。

答案 3 :(得分:1)

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

考虑您要返回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;
}
这样你就不必担心内存泄漏了...... 这是最简单的方法。当然你可以使用智能指针。但在你的水平上,我会说坚持这种方法。