【发布时间】:2013-10-07 13:31:25
【问题描述】:
我写了一个小程序,但是主析构函数不能正常工作。这是程序的代码:
#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 仍在打印我在构造函数中提供的确切名称,即使它不应该是。
请解释这种行为。
【问题讨论】:
-
obj1和obj2保存指向字符串文字的指针。正如我在对您的第一个问题的评论中指出的那样,您不能删除这些。您正在调用未定义的行为。 -
将
char*替换为std::string您正在将 char* 视为不是指针。 -
您的
deletes 未与对应的news 配对。这应该表明并非一切都很好......此外,在您删除指针后,指针本身不会被切碎或其他东西,因此它仍然指向内存中的相同位置。使用delete[] ptr; ptr = NULL;来避免这种情况。
标签: c++