C++对象析构之后再访问

    技术2022-07-10  106

      在对象被析构之后,仍然可以通过该对象的指针访问相应的静态方法以及没有被static关键字修饰,但是没有访问非静态成员变量的方法)。   如果访问了静态成员变量,则会根据不同的编译器得到不同的结果,可能是预期之外的值,可能是直接段错误。   如果方法A调用了方法B,并且方法A和B都是没有被static关键字修饰,且没有访问非静态成员变量的方法,那么依然可以正常执行。


    下面给出项目里部分示例代码,上述3种情况的代码很容易构造,此处不赘述。

    #include <iostream> using namespace std; class A { public: A(int _a); ~A(); int ap; void print(); void printf(); int a(); }; A::A(int _a) { ap = _a; } A::~A() { } void A::print() { cout << "This is print." << endl; } void A::printf() { cout << a() << endl; } int A::a() { return ap; } int main() { A* a = new A(10); delete a; a->print(); cout << "a.a(): " << a->a(); a->printf(); return 0; }

      因此,根据以上的测试结果,我怀疑这是编译器做了特殊处理,将其编译成了静态方法。但是我不会查看汇编代码,因此我使用如下代码进行测试。


    #include <iostream> using namespace std; class A { public: A(int _a); ~A(); int ap; void print(); void printf(); int a(); }; A::A(int _a) { ap = _a; } A::~A() { } void A::print() { cout << "This is print." << endl; } void A::printf() { cout << a() << endl; } int A::a() { return 128; } int main() { A* a = new A(10); delete a; A::print(); cout << "a.a(): " << a->a() << endl; return 0; } //很遗憾编译通不过。但是这并不能证明我的猜想是错的。
    Processed: 0.018, SQL: 9