我正在尝试学习C++,并且正在编写程序来学习复制构造函数和运算符重载.我很惊讶下面的程序使用Copy构造函数时不会崩溃说"Double Free",而使用Operator = overloading时会一直崩溃.
#include <iostream>
using namespace std;
class XHandler
{
public:
XHandler()
{
data = new char[8];
strcpy(data, "NoName");
}
XHandler (const char *str)
{
data = new char (strlen(str) + 1 );
strcpy (data, str);
}
XHandler (const XHandler &xh)
{
data = xh.data;
}
XHandler& operator = (const XHandler &xh)
{
data = xh.data;
}
~XHandler()
{
delete data;
}
void debug()
{
cout << data <<endl;
}
private:
char *data;
};
int main()
{
XHandler wm("hello"), wb("there");
wm.debug();
wb.debug();
XHandler wc (wm);
wc.debug();
XHandler wd;
wd = wc;
wd.debug();
}
Run Code Online (Sandbox Code Playgroud)
请注意,在复制构造函数和运算符重载中,我只是将"数据"指针从一个对象复制到另一个对象.当为'wd'和'wc'调用析构函数时,它会一致地崩溃程序.如果我评论下面的行并只执行复制构造函数,程序根本不会崩溃.我希望既然'wc'和'wm的数据变量也指向同一个指针,程序就会崩溃.
XHandler wd;
wd = wc;
wd.debug();
Run Code Online (Sandbox Code Playgroud)
我理解双删除是未定义的行为.但是,我想知道它是一直以某种方式崩溃而不是另一种方式崩溃.
"未定义的行为"的行为是未定义的.这意味着,没有人为这种情况付出努力,因为这种情况不应该发生.即使是工作程序也可能是"未定义的行为".
在你的双重删除的特殊情况下,会发生什么,实际上取决于分配器的实现.通常的实现是将释放的内存放入列表中,并且下一个分配将满足该列表中的元素.如果双重删除一块内存,它将被添加到列表中两次.然后两个分配将满足相同的内存块,因此将在同一内存位置创建两个对象.
BTW:你的析构函数已经坏了,因为它没有使用数组删除.
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |