This question already has answers here:
What is The Rule of Three?
(8个答案)
6年前关闭。
我在想出一种方法来返回一个对象(该函数在函数内本地声明)时遇到麻烦,该对象具有附加的动态内存。问题是析构函数,该析构函数在对象超出范围时(即当我返回它并要使用已删除的内存中的数据时)运行并删除动态内存!我这样做是为了重载加法运算符。
我正在尝试做类似的事情:
我的析构函数很简单:
我们欢迎所有的建议!
(8个答案)
6年前关闭。
我在想出一种方法来返回一个对象(该函数在函数内本地声明)时遇到麻烦,该对象具有附加的动态内存。问题是析构函数,该析构函数在对象超出范围时(即当我返回它并要使用已删除的内存中的数据时)运行并删除动态内存!我这样做是为了重载加法运算符。
我正在尝试做类似的事情:
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; }
我们欢迎所有的建议!
最佳答案
您需要提供一个复制构造函数,用于将ptr
的内容复制到新对象。
如果MyObj
没有复制ptr
内容的副本构造函数,则您返回的对象的ptr
指向删除的内存。不用说,如果您在这种情况下尝试访问ptr
,那么将会发生不好的事情。
通常,如果必须为类编写一个析构函数,则还应该编写一个拷贝构造函数和一个赋值运算符来处理任何动态内存或其他资源的拷贝。这是WhosCraig提到的三法则。
如果使用的是支持C++ 11的现代编译器,则可能还需要阅读move semantics
关于c++ - 返回带有动态内存的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19777884/