我已经编写了一个小程序,但是主析构函数无法正常工作。这是程序的代码:

#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应该销毁并删除变量namenationality。当我第二次调用obj1.display();时,它应该在屏幕上显示垃圾。

但是obj1仍在打印我在构造函数中提供的确切名称,即使不是。

请解释这种现象。

最佳答案

您的delete[]调用未定义的行为,因为您试图破坏字符串文字。什么都可能发生。

即使您自己分配了内存,您仍然会遇到未定义的行为,因为您将尝试访问已删除的内存:

obj1.display();
{
   citizen obj2 = obj1;
}
obj1.display();  // ILLEGAL


因为没有定义赋值运算符,所以将使用编译器生成的赋值运算符,该运算符将指针分配给相同的内存-您先销毁然后尝试访问的内存。

09-10 04:53
查看更多