C 删除具有内存位置的操作员

C++ delete operator with memory locations

本文关键字:位置 操作员 内存 删除      更新时间:2023-10-16

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

Point ppaa = *new Point;
Point *p = &ppaa;
ppaa.xpos = 1;
ppaa.ypos= 3;
delete &ppaa;
delete p;

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

 T t = x;

被称为复制初始化。它:

  • 它试图将x转换为类型T&
  • 然后将该对象上的对象复制到定位化对象t

所以您的代码语句,

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

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