1

我在想办法返回一个附加了动态内存的对象(在函数中本地声明)时遇到了麻烦。问题是析构函数,它在对象超出范围时运行并删除动态内存,即当我返回它并想要使用已删除的内存中的数据时!我正在为重载的加法运算符执行此操作。

我正在尝试做类似的事情:

MyObj operator+( const MyObj& x, const MyObj& y )
{
   MyObj z;

   // code to add x and y and store in dynamic memory of z

   return z;
}

我的析构函数很简单:

MyObj::~MyObj()
{ delete [] ptr; }

我们欢迎所有的建议!

4

2 回答 2

3

没关系。

不用担心,在删除之前,您的对象将被复制到另一个对象中或将被临时使用。

但...

尝试编写一个定义明确的复制构造函数(如果你没有的话)。你应该遵守五法则

另一方面,您的代码很有可能进行 RVO 优化,以避免不必要的复制和额外的破坏。

此外,C++11 提供了移动语义以避免不必要的复制。为此,您应该编写move-constructormove-assignment

于 2013-11-04T21:53:21.910 回答
2

您需要提供一个复制构造函数,将 的内容复制ptr到新对象。

如果MyObj没有复制内容的复制构造函数,ptr那么您返回的对象将ptr指向已删除的内存。不用说,如果你在这种情况下尝试访问ptr,那么坏事就会发生。

通常,如果您必须为您的类编写析构函数,您还应该编写一个复制构造函数和赋值运算符来处理任何动态内存或其他资源的复制。这是 WhosCraig 提到的三法则。

如果您使用的是支持 C++11 的现代编译器,您可能还需要阅读移动语义

于 2013-11-04T21:53:22.840 回答