双重自由错误而不是分段错误

时间:2017-03-09 08:28:26

标签: c++

期待分段错误但获得双重免费或损坏(fasttop):0x0000000000cf4c20 ***

PFB代码

#include<iostream>
using namespace std;

class test
{
public:
    int size;
    int *elem;
    test(int x):size(x),elem(new int[x])
    {
        cout<<"default constructor"<<endl;
    }
    test(const test & x)
    {
        cout<<"copy constructor and shallow copying";
        this->size=x.size;
        this->elem=x.elem;
    }
    ~test()
    {
        delete [] elem; 
    }
    void display()
    {
        for (int i=0;i<size;i++)
        {
        cout<<*(elem+i)<<endl;

        }
    }
};

int main()
{
    test t(3);
    t.elem[0]=12;
    t.elem[1]=24;
    t.elem[2]=33;
    {
        test f(t);
        f.display();
        t.display();
    }    
    t.display();
}

我正在尝试理解浅层复制,并期待分段错误。

1 个答案:

答案 0 :(得分:5)

除了指向已分配内存的有效指针或nullptrdelete(或delete[])之外的任何内容都会导致未定义的行为

此外,由于您在t销毁delete[]后将f对象中的指针用于<{1}},因此您已经存在未定义的行为在您上一次display来电。

当你有UB(未定义的行为)时,会发生什么,这真的是无关紧要的。有时可能似乎工作正常(比如在删除内存后调用display),有时会出现分段错误,有时会出现其他错误(例如双重错误)免费),有时你得到nasal demons。根据其定义,未定义的行为是 undefined