带有内存位置的C ++ delete运算符

时间:2012-11-03 05:08:05

标签: c++ pointers reference delete-operator

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

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

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

delete &ppaa;
delete p;

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

1 个答案:

答案 0 :(得分:3)

 T t = x;

称为复制初始化。它:

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

所以你的代码声明,

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

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