0

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

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

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

我尝试使用逗号表达式作为“ return ptr->value, delete ptr”的另一种棘手的方法,但是有一个编译错误说“void value not ignored as it hould be”。

有没有可能更优雅地实现这一目标的方法?

非常感谢。


更新

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

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

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

4

4 回答 4

4

当然。不要使用指针,如果必须,请使用智能指针 ( 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并且不会因此受到影响。

于 2012-12-30T14:31:32.357 回答
2

通常的解决方法是,第一,不使用指针,这样就没有什么要删除的了,第二,当有其他资源需要清理时,在析构函数中进行清理,在return语句之后会自动调用已将返回值复制到必须复制的位置。

如果可以返回,则可以复制,因此不应该动态分配,最值得注意的例外是涉及多态对象的地方;多态性需要指针或引用才能工作,并且大多数时候(尽管有例外),多态对象将被动态分配。在这种情况下,如果多态对象的实际生命周期对应于本地范围,则可以使用 std::auto_ptr(或者std::unique_ptr在不太可能的情况下,您可以依靠 C++11)。

于 2012-12-30T15:43:33.110 回答
2

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

于 2012-12-30T14:30:40.293 回答
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;
}

这样你就不用担心内存泄漏了。这是最简单的方法。当然你可以使用智能指针。但在你的水平上,我会说坚持这种方法。

于 2012-12-30T14:41:47.033 回答