我是C ++新手,现在正在研究new
和delete
个关键字。
Point ppaa = *new Point;
Point *p = &ppaa;
ppaa.xpos = 1;
ppaa.ypos= 3;
delete &ppaa;
delete p;
请您解释为什么我不能使用& ppaa删除上面的ppaa? 我知道删除只能在指针上操作,但我无法理解为什么上面不可能,因为它们实际上是内存位置。搜索类似的问题,似乎这与第一行发生的复制操作有关,但我没有很好的解释。
答案 0 :(得分:3)
T t = x;
称为复制初始化。它:
x
转换为T
&类型的对象。 t
。所以你的代码声明,
Point ppaa = *new Point;
Point
obejct
ppaa
。这两个对象都是不同的对象
如您所见,执行此语句后,您没有任何指向堆对象的指针
在这种情况下,您需要将new
返回的地址传递给delete
,因为您不再拥有该地址,导致内存泄漏。
此外,请注意&ppaa
不返回new
返回的地址,它返回堆栈中对象ppaa
的地址。将此地址传递给delete
会导致未定义的行为,因为ppaa
从未在freestore / dynamic上分配,它是基于堆栈的本地/自动对象。