c++ - 为什么删除后对象指针还能被操作?

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

最佳答案

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

希望这对您有所帮助!

关于c++ - 为什么删除后对象指针还能被操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22828343/

相关文章:

opencv - opencv中的内存泄漏问题

android - 使用 android Handler 时如何解决有关内存泄漏的警告?

c++ - 我如何理解 C++ 中是否删除了指针

c++析构函数调用删除运算符?

c++ - 在这种情况下我应该如何使用删除c++

c++ - 如何在没有 boost::timer 的情况下以毫秒为单位计时

c++ - 我该如何创建一个类,以对对象进行类型删除,直到调用了一个函数,而没有事先指定可能的函数列表?

c++ - 无法让 openGL 的 glDrawElements 与几何着色器一起工作

c++ - 线程基本..需要帮助

go - 生产中的 FreeOSMemory()