双重删除数据不会崩溃

Ale*_*der 4 c++ memory

我正在尝试学习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)

我理解双删除是未定义的行为.但是,我想知道它是一直以某种方式崩溃而不是另一种方式崩溃.

Tor*_*zki 5

"未定义的行为"的行为是未定义的.这意味着,没有人为这种情况付出努力,因为这种情况不应该发生.即使是工作程序也可能是"未定义的行为".

在你的双重删除的特殊情况下,会发生什么,实际上取决于分配器的实现.通常的实现是将释放的内存放入列表中,并且下一个分配将满足该列表中的元素.如果双重删除一块内存,它将被添加到列表中两次.然后两个分配将满足相同的内存块,因此将在同一内存位置创建两个对象.

BTW:你的析构函数已经坏了,因为它没有使用数组删除.