我写了一个小程序,但是主析构函数不能正常工作。这是程序的代码:
#include<iostream.h>
class citizen {
private:
char* name;
char* nationality;
public:
citizen(char* name, char* nationality) {
this->name = name;
this->nationality = nationality;
}
citizen(const citizen &obj) {
name = obj.name;
nationality = obj.nationality;
}
void display() {
cout << "Name: " << name << endl;
cout << "Nationality: " << nationality << endl;
}
~citizen() {
if(name){
delete[]name;
}
if(nationality) {
delete []nationality;
}
}
};
main() {
citizen obj1("Ali", "Pakistani");
obj1.display();
{
citizen obj2 = obj1;
}
obj1.display();
system("pause");
}
我所知道的是,在 main
函数中,我将 obj1
的状态分配给 obj2
,从那个地方它们都是现在指向相同的内存区域。而代码 citizen obj2 = obj1;
位于两个大括号之间。
{
citizen obj2 = obj1;
}
因此在执行第二个大括号后,obj2
应该销毁并删除变量 name
和 nationality
。当我第二次调用 obj1.display();
时,它应该在屏幕上显示垃圾。
但是 obj1
仍在打印我在构造函数中提供的确切名称,尽管它不应该是。
请解释此行为。
最佳答案
您的 delete[]
会调用未定义的行为,因为您正试图破坏字符串文字。 任何事情都可能发生。
即使您自己分配内存,您仍然会遇到未定义的行为,因为您会尝试访问您已经删除的内存:
obj1.display();
{
citizen obj2 = obj1;
}
obj1.display(); // ILLEGAL
因为您没有定义赋值运算符,将使用编译器生成的运算符,它只是将指针分配给同一内存 - 您销毁然后尝试访问的内存。
关于c++ - 析构函数不销毁对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19226251/