【问题标题】:How does this work? Pointer to pointer assignment这是如何运作的?指向指针赋值的指针
【发布时间】:2021-03-22 07:48:42
【问题描述】:
#include <iostream>
using namespace std;
int main() {
    int *p1;
    p1 = new int;
    int *p2;
    p2 = new int;
    p2 = p1;    // what happens here?
    *p1=5;
    cout << "pointer 2 is " << *p2 << endl << *p1 << endl;  // both give out 5
    delete p1;  // what happens to p2 ?
    cout << "pointer 2 is " << *p2 << endl;
    delete p2;
    return 0;
}

当我删除指针对象 p1 时会发生什么?现在指针 p2 引用的是什么?有人可以解释一下吗?感谢您的帮助

【问题讨论】:

  • 您可能会发现this question 有助于理解什么是指针。这种情况在“内存泄漏”标题下进行了介绍。
  • 要点:指针是一个变量,它恰好包含一个地址,可用于访问该地址处的对象。除此之外,它就像任何其他变量一样,因此p2 = p1;p2 存储的地址替换为p1 存储的地址。
  • @Brian:谢谢你的链接。这种解释是内存管理的一个很好的类比。很有帮助

标签: c++ dynamic-memory-allocation


【解决方案1】:

指针 p2 现在引用的是什么?

什么都没有。它悬空。它指向 p1 所指向的同一事物,但你已将其删除。

因此,您的*p2 已损坏,您的delete p2 也是如此;这些都有未定义的行为。

您还泄露了第二个new int,因为p2 曾经指向它,但在您写p2 = p1 时停止这样做(您将其更改为指向第一个 @ 987654329@ 代替,就像p1 一样),并且没有其他方法可以引用它。

【讨论】:

  • 漂亮的图表。我建议也包括最后一个cout &lt;&lt; *p2 声明
  • @RemyLebeau 好主意
  • @Asteroids With Wings 我的上帝!那太好了。显然我的代码有两个罪过......内存泄漏,试图删除一个悬空的对象。我喜欢它的火部分
【解决方案2】:
p2 = p1;    // what happens here?

您只是将p1(指向的内存地址)复制到p2 中。这与这样做没有什么不同:

int i1, i2;
i1 = 12345;
i2 = i1;

但是,由于问题中的 在使用 new 分配的内存地址中,您现在有内存泄漏,因为您丢失了指向第二个分配的 int 的唯一指针987654327@ 之前指的是。现在p1p2 都指向内存中的第一个int

cout << "pointer 2 is " << *p2 << endl << *p1 << endl;  // both give out 5

是的,因为p1p2 指向同一个内存地址。

delete p1;  // what happens to p2 ?

p2 在这里没有任何反应,它仍然指向与之前相同的内存地址。 p1p2 是自变量,因此对其中一个的更改不会影响另一个。但是,delete 已经释放了第一个int,它存储在p1p2 指向的内存地址,所以现在它们都是指向无效内存的悬空指针。由于您在此之后不使用p1,因此p1 可以,但对于p2,接下来的语句:

cout << "pointer 2 is " << *p2 << endl;
delete p2;

会导致未定义的行为,因为您正在通过悬空的p2 访问无效内存。读取可能成功返回仍然存在于内存地址的陈旧数据,或者它可能返回垃圾,或者它可能崩溃。 delete 几乎肯定会崩溃,因为之前已经释放了内存,但这也不能保证。 Undefined Behaivor 就是这样 - undefined - 所以实际上任何事情都可能发生。

【讨论】:

  • 感谢您详细解释出了什么问题,尤其是尝试访问 p2 指向的对象。这是我在执行程序时收到的错误消息:“free(): double free detected in tcache 2 Aborted”。我现在明白发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多