我是C++的新手,现在正在学习new
和delete
关键字。
Point ppaa = *new Point;
Point *p = &ppaa;
ppaa.xpos = 1;
ppaa.ypos= 3;
delete &ppaa;
delete p;
请问为什么我无法使用&ppaa删除上面的ppaa?我知道delete只能操作指针,但我不明白为什么这样做不行,因为它们实际上是内存位置。搜索类似的问题,似乎与第一行发生的复制操作有关,但我没有很好的解释。
我是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/dynamically上分配,而是基于堆栈的本地/自动对象。