双重免费或腐败(如果重新排序,则运行正常)

这个问题在这里已经有了答案:

  • 双免费或腐败......但为什么? 6个答案
  • 什么是三项规则? 8个答案

  • 你的类型管理资源(一个动态分配的数组),但没有实现三的规则。 当你这样做时:

    q.push_back(t);
    

    q制作一份它拥有的t的副本。 所以现在你有两个引用相同数据的对象副本,并尝试在其中调用delete

    您需要实现复制构造函数和赋值运算符。 或者使用管理自己资源的类,例如std::stringstd::vector

    在已经删除的数组上调用delete[]是未定义的行为(UB)。 这意味着有时候你的程序似乎可以工作。 你不能依赖具有未定义行为的程序来做任何事情。 换行1和2颠倒了tq被破坏的顺序。 这似乎会在您的平台上产生不同的结果,但都是UB。


    当您pushpush送到矢量时,C ++会自动生成一个Test对象的浅表副本。 当向量超出范围并被破坏时, myArray指针是delete[] d。 然后,当Test超出范围时,同样的指针会再次被delete[] d。

    您应该指定一个复制构造函数并对该对象进行深层复制。 随着一个新的阵列。

    也强烈建议重载赋值运算符(在上面的同一链接中解释)。


    因为你需要一个拷贝构造函数。

    push_back复制参数,并且因为您没有提供复制构造函数,所以有一个默认值,制作一个浅拷贝(只拷贝指针,没有内容*)

    所以,你需要定义一个

    Test( const Test& other )
    {
        // ...
    }
    Test& operator=( const Test& other ) // just in case
    {
        // ...
    }
    

    并进行深层复制,手动复制char*缓冲区。

    *)会导致双重删除 - 一次来自t的析构函数,一次来自q的析构函数(它调用向量中所有元素的析构函数)

    链接地址: http://www.djcxy.com/p/73181.html

    上一篇: double free or corruption (runs ok if reorder lines)

    下一篇: Why is my destructor being called and how can I fix it