删除后,为什么仍然可以操纵对象指针?

时间:2014-04-03 05:10:51

标签: c++ memory-leaks delete-operator

我有一些非常有趣的代码片段。当我删除一个对象时,它的值变为零,但仍然可以操纵对象指针,这是不是很奇怪?

#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后,其值变为零,但仍可引用?我不知道为什么?

2 个答案:

答案 0 :(得分:4)

您正在做的事情导致未定义的行为,这意味着任何都可能发生。调用delete a结束a指向的对象的生命周期,并将内存释放回免费存储(C ++规范的术语,我们通常称之为堆)。此时,访问内存会导致未定义的行为。在你的情况下,巧合的是打印出旧值,但没有理由保证这一点。理论上,如果运行此代码,理论上可以使用兼容的C ++实现格式化硬盘驱动器。

希望这有帮助!

答案 1 :(得分:3)

  

删除a后,其值变为零,但仍然可以   引用?我不知道为什么?

不,一旦删除它,它就不会指定null。如果你想这样做,你需要明确地做。

delete a;
a = NULL;

你不应该在调用delete之后使用a。会有未定义的行为 而指针正悬空。不要使用它。