我已经编写了一个小程序,但是主析构函数无法正常工作。这是程序的代码:
#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
因为没有定义赋值运算符,所以将使用编译器生成的赋值运算符,该运算符将指针分配给相同的内存-您先销毁然后尝试访问的内存。