c++ - 析构函数不销毁对象

标签 c++

我写了一个小程序,但是主析构函数不能正常工作。这是程序的代码:

#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

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

关于c++ - 析构函数不销毁对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19226251/

相关文章:

c++ - 为什么我需要 -fPIC 来使用 --unresolved-symbols=ignore-in-object-files 进行编译?

c++ - 如何将仿函数分配给函数指针?

c++ - Qt paintevent() 未触发

c++ - 为什么模板参数失去常量性?

c++ - 清理 `QSettings` 注册表项的最佳方法(Windows 上的 Qt 5)

c++ - 为什么是const指针而不是指向const的指针?

C++:隐藏子类中的成员。是否有意义?

c++ - 错误 LNK2019 : unresolved external symbol "public: __thiscall

c++ - 为什么 swap() 函数不能与 vector 的迭代器一起使用?

c++ - 如何使用 boost::serialization 序列化 TAO::unbouded_basic_string_sequence<T>?