假设我通过 p1 进行动态内存分配,如下所示,

int* p1 = new int;
*p1 = 1;

我知道 p1 引用的内存可以通过使用来释放
delete p1;
p1 = nullptr;

但是我想知道是否还有另一个指针 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;

最佳答案

您可以删除 p2 ,但取消引用 p1 将导致未定义的行为,并可能导致段错误。

它是这样工作的:

  • 在某个地址分配内存。
  • p1p2 都指向这个内存位置。
  • 一旦 p2 被删除 - p1 仍然指向这个内存位置。
    没有泄漏,一切都很好 - 只是不要取消引用 p1 。你可以自由地做 p1 = nullptr ,但不能 *p1 = 1 。此外,你不能删除 p1 ,因为它已经被删除了,你可能会发现段错误。
  • 关于c++ - 关于 C++ 中的动态内存分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40830717/

    10-11 22:40
    查看更多