【问题标题】:After delete,why object pointer can still be manipulated? [duplicate]删除后,为什么对象指针仍然可以被操作? [复制]
【发布时间】:2014-05-14 17:35:57
【问题描述】:

我有一些非常有趣的代码 sn-ps。当我删除一个对象时,它的值变为零,但对象指针仍然可以被操作,这很奇怪吗?

#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后,它的值变为零,但它仍然可以被引用?不知道为什么?

【问题讨论】:

  • 访问被破坏的对象是未定义的行为。你不走运,因为程序运行没有错误。

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


【解决方案1】:

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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    我删除a后,它的值变为零,但它仍然可以 参考?不知道为什么?

    不,一旦你删除它,它就不会分配一个空值。如果你想这样做,你需要明确地这样做。

    delete a;
    a = NULL;
    

    你不应该在对它调用 delete 之后使用它。会有未定义的行为 并且指针悬空。永远不要使用它。

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      相关资源
      最近更新 更多