我正在使用浅拷贝将一个对象复制到另一个对象,当 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
在退出时两次调用同一array
值main
。 这是一个双重删除错误。
您需要实现用户定义的复制构造函数和赋值运算符,以允许正确复制vector
类。 阅读 3 法则以确保复制对象不会导致内存损坏。