#include <iostream>
using namespace std;

class A
{
private:
   int m_i;
   friend int main(int argc, char const *argv[]);
public:
   A (int i = 0):m_i(i){};
   void display()
   {
       cout << m_i << endl;
   }
   int result() {return m_i;}
};

void createA(A *pa)
{
   pa = new A(1);
}

A* createA()
{
   A a(2);
   return &a;
}

void createAonstack()
{
   A a(3);
}

int main(int argc, char const *argv[])
{
   A a;
   A * pa = &a;
   pa->display();
   createA(pa);
   pa->display();

   A * a2 = createA();
   cout << a2->m_i << endl;
   createAonstack();
   cout << a2->m_i << endl;
   return 0;
}

上面程序的结果是
0
0
2
3

如何解释结果2和3?根据我的理解,应该对在createA()函数中创建的对象进行解构,并且其返回的指针应该指向NULL,但是为什么a2->m_i可以是2。而且3甚至更加令人困惑,因为似乎createAonstack()函数无关与a2。

最佳答案

你说



的确



这不是真的


createA返回的指针为非NULL,即使它是在调用函数中使用的无效指针也是如此。



纯粹是巧合。这确实是未定义的行为。取消引用a2时,可能会发生任何事情。

关于c++ - 构造,解构和指向类对象的C++机制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24331249/

10-11 21:28