我是 C++ 新手,现在正在研究 new
和 delete
关键字。
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;
Point
对象ppaa
。 这两个对象都是不同的对象。
如您所见,执行此语句后,您不再有任何指向堆对象的指针。
在这种情况下,您需要将
new
返回的地址传递给 delete
,由于您不再拥有该地址,因此会导致内存泄漏。此外,请注意
&ppaa
不返回 new
返回的地址,它返回位于堆栈上的对象 ppaa
的地址。将此地址传递给 delete
会导致 未定义行为 因为 ppaa
从未在 freestore 上分配/动态分配,它是基于堆栈的本地/自动对象。关于C++ 删除操作符和内存位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13206140/