重新排列代码行时未引发错误"Double free or corruption"



我正在使用浅拷贝将一个对象复制到另一个对象,当 main() 超出范围时,调用析构函数并抛出错误":双重释放或损坏(fasttop):",这完全没问题,因为我使用的是浅拷贝。现在,当我在两个副本之间创建另一个对象时,它不会抛出任何错误,这困扰着我。

int main(int argc, char *argv[])
{   
    int n =5;
    vector vec(n);  
    vector vec1(vec);   
    cout<<vec<<endl;
    cout<<vec1<<endl;
    return 0;
}

给出输出这是我使用浅拷贝时预期的现在,当我在两者之间再添加一个对象时,不会抛出任何错误

int main(int argc, char *argv[])
{   
    int n =5;
    vector vec(n);  
    vector vec2(n);
    vector vec1(vec);   
    cout<<vec<<endl;
    cout<<vec1<<endl;
    return 0;
}

不给出错误输出

您的代码会导致未定义的行为。 当您的代码导致未定义的行为时,任何事情都可能发生。您不应期望出现任何特定症状,例如崩溃或未崩溃。

由于本节,您的代码会导致未定义的行为:

array = new int[0]; 
this->num=n;    
for ( int i=0; i<n; i++)
    array[i]=i;

n > 0 时,你写出了分配空间的范围。

一个明显的问题是您的vector类缺少用户定义的复制构造函数。 当您在main中执行此操作时:

vector vec1(vec);  

您正在制作浅表副本(复制指针值)。 您将看到,当main结束时为两个vector对象调用 vector 的析构函数时:

~vector()
{
    delete [] array; // <-- Same pointer value being deleted twice
    cout<<"Base class Dest"<<endl;
}

这会导致delete在退出时两次调用同一arraymain。 这是一个双重删除错误。

您需要实现用户定义的复制构造函数和赋值运算符,以允许正确复制vector类。 阅读 3 法则以确保复制对象不会导致内存损坏。

最新更新