我是 C++ 新手,现在正在研究 newdelete 关键字。

Point ppaa = *new Point;
Point *p = &ppaa;

ppaa.xpos = 1;
ppaa.ypos= 3;

delete &ppaa;
delete p;

你能解释一下为什么我不能用&ppaa删除上面的ppaa吗?
我知道 delete 只能对指针进行操作,但我不明白为什么上面是不可能的,因为它们实际上是内存位置。搜索类似的问题,似乎这与第一行发生的复制操作有关,但我没有很好的解释。

最佳答案

 T t = x;

称为 复制初始化 。它:
  • 它尝试将 x 转换为 T &
  • 类型的对象
  • 然后将该对象复制到要初始化的对象 t 中。

  • 所以你的代码声明,
    Point ppaa = *new Point;
    
  • 在 freestore/heap 和
  • 上创建一个 Point 对象
  • 然后复制该对象以创建堆栈对象 ppaa

  • 这两个对象都是不同的对象。
    如您所见,执行此语句后,您不再有任何指向堆对象的指针。
    在这种情况下,您需要将 new 返回的地址传递给 delete,由于您不再拥有该地址,因此会导致内存泄漏。
    此外,请注意 &ppaa 不返回 new 返回的地址,它返回位于堆栈上的对象 ppaa 的地址。将此地址传递给 delete 会导致 未定义行为 因为 ppaa 从未在 freestore 上分配/动态分配,它是基于堆栈的本地/自动对象。

    关于C++ 删除操作符和内存位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13206140/

    10-12 14:18