使用动态内存返回对象

时间:2013-11-04 21:51:06

标签: c++

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

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

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; }

任何建议都会非常感谢!

2 个答案:

答案 0 :(得分:3)

没关系。

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

<强>可是...

尝试编写定义良好的复制构造函数(如果没有)。 你应该服从rule of five

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

此外,C ++ 11提供move semantics以避免不必要的副本。为此,您应该编写移动构造函数移动分配

答案 1 :(得分:2)

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

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

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

如果您使用的是支持C ++ 11的现代编译器,您可能还想阅读move semantics