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

C++ 删除后,为什么仍然可以操作对象指针?,c++,memory-leaks,delete-operator,C++,Memory Leaks,Delete Operator,我有一些非常有趣的代码片段。当我删除一个对象时,它的值变为零,但对象指针仍然可以操作,这是wierd吗 #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.ve

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

#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;
}

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

你所做的会导致未定义的行为,这意味着任何事情都可能发生。调用<代码>删除< /COD>结束由“代码> A/Engult>指向的对象的生命周期,并将内存释放回自由存储(C++规范的术语,我们通常称之为堆)。此时,访问内存会导致未定义的行为。在您的情况下,这碰巧打印出旧值,但没有理由保证这一点。从理论上讲,如果你运行这个代码,你可以有一个兼容的C++实现,它可以格式化硬盘驱动器。
希望这有帮助

你所做的会导致未定义的行为,这意味着任何事情都可能发生。调用<代码>删除< /COD>结束由“代码> A/Engult>指向的对象的生命周期,并将内存释放回自由存储(C++规范的术语,我们通常称之为堆)。此时,访问内存会导致未定义的行为。在您的情况下,这碰巧打印出旧值,但没有理由保证这一点。从理论上讲,如果你运行这个代码,你可以有一个兼容的C++实现,它可以格式化硬盘驱动器。 希望这有帮助

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

不,一旦您删除它,它将不会分配一个空值。如果您想这样做,您需要显式地这样做

delete a;
a = NULL;
在调用delete之后,不应使用a。会有未定义的行为 当指针悬空时。永远不要使用它

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

不,一旦您删除它,它将不会分配一个空值。如果您想这样做,您需要显式地这样做

delete a;
a = NULL;
在调用delete之后,不应使用a。会有未定义的行为
当指针悬空时。永远不要使用它。

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