#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/