3

我是 C++ 新手,现在正在学习newdelete关键字。

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

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

delete &ppaa;
delete p;

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

4

1 回答 1

3
 T t = x;

称为复制初始化。它:

  • 它尝试转换为&x类型的对象T
  • 然后将该对象复制到 to-initialized objectt中。

所以你的代码声明,

Point ppaa = *new Point;
  • Point在freestore/heap 上创建一个对象和
  • 然后复制该对象以创建堆栈对象ppaa

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

于 2012-11-03T05:10:37.817 回答