关于C++中的动态内存分配

Nic*_*las 3 c++ pointers dynamic-allocation

假设我通过p1以下方式进行动态内存分配,

int* p1 = new int;
*p1 = 1;
Run Code Online (Sandbox Code Playgroud)

我知道引用的内存p1可以通过使用释放

delete p1;
p1 = nullptr;
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有另一个指针p2指向1,我可以delete这个指针,以释放内存?指针会发生什么p1?此外,什么是之间的关系p1p2本质?例如,

int* p1 = new int;
*p1 = 1;
int* p2 = p1;
// Can I delete p2 like this? And what would happen to p1?
delete p2;
p2 = nullptr;
Run Code Online (Sandbox Code Playgroud)

Sta*_*ght 8

您可以删除p2,但解除引用p1会导致未定义的行为,以及可能的分段错误.

它的工作原理如下:

  1. 内存分配在某个地址.
  2. 两者p1p2指向此内存位置.
  3. 一旦p2删除- p1仍然指向该内存位置.没有泄漏,一切都很好 - 只是不要取消引用p1.你可以自由地做p1 = nullptr,但不能*p1 = 1.此外,您无法删除p1,因为它已被删除,您可能会捕获段错误.