我有一些非常有趣的代码片段。当我删除一个对象时,它的值变为零,但仍然可以操纵对象指针,这是不是很奇怪?
#include <iostream>
#include <vector>
using namespace std;
class B
{
public:
vector<double> vec;
};
class A
{
public:
B b;
};
int main()
{
A* a = new A();
a->b.vec.push_back(1);
a->b.vec.push_back(2);
A* a1;
delete a;
cout << "before" << endl;
a1= a;
cout << a1->b.vec[0] << endl;
cout << "after" << endl;
return 0;
}
输出:
before
0
after
删除a后,其值变为零,但仍可引用?我不知道为什么?
答案 0 :(得分:4)
您正在做的事情导致未定义的行为,这意味着任何都可能发生。调用delete a
结束a
指向的对象的生命周期,并将内存释放回免费存储(C ++规范的术语,我们通常称之为堆)。此时,访问内存会导致未定义的行为。在你的情况下,巧合的是打印出旧值,但没有理由保证这一点。理论上,如果运行此代码,理论上可以使用兼容的C ++实现格式化硬盘驱动器。
希望这有帮助!
答案 1 :(得分:3)
删除a后,其值变为零,但仍然可以 引用?我不知道为什么?
不,一旦删除它,它就不会指定null。如果你想这样做,你需要明确地做。
delete a;
a = NULL;
你不应该在调用delete之后使用a。会有未定义的行为 而指针正悬空。不要使用它。