gpt4 book ai didi

具有内存位置的 C++ 删除运算符

转载 作者:太空狗 更新时间:2023-10-29 21:25:53 24 4
gpt4 key购买 nike

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

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 会导致Undefined Behavior,因为 ppaa 从未在 freestore 上分配/动态地它是一个基于堆栈的本地/自动对象。

关于具有内存位置的 C++ 删除运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13206140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com