gpt4 book ai didi

c++ - 可以在分配有新位置的指针上调用 delete 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:36 25 4
gpt4 key购买 nike

我们可以在分配给 placement new 的指针上调用 delete 吗?如果没有那么为什么?请详细说明。

我知道没有展示位置删除。但是我想知道为什么只删除opetator不能删除内存而不关心指针指向的内存是如何分配的?

delete 做两件事:

  1. 调用析构函数
  2. 释放内存

而且我认为 delete 没有理由不能对通过 placement new 创建的对象调用这两个操作中的任何一个。知道原因吗?

最佳答案

您只能对使用operator new 创建的指针调用delete。如果您将放置 new 与由普通 operator new 分配的内存位置一起使用,那么您可以安全地对其使用 delete(前提是您得到正确的类型和指针)。但是,您可以在任何内存上使用放置 new,因此您通常会以其他方式管理该内存并手动调用对象的析构函数。

例如,在这种复杂且通常不必要的情况下,删除您使用放置 new 的内存是安全的,但这只是因为您使用 分配了它>新之前:

char* mem = new char[sizeof(MyObject)];
MyObject* o = new (mem) MyObject;

// use o

o->~MyObject(); // with placement new you have to call the destructor by yourself

delete[] mem;

但是,这是非法的:

char mem[16]; // create a buffer on the stack, assume sizeof(MyObject) == 16

MyObject* o = new (mem) MyObject; // use stack memory to hold a MyObject
// note that after placement new is done, o == mem
// pretend for this example that the point brought up by Martin in the comments didn't matter

delete o; // you just deleted memory in the stack! This is very bad

另一种思考方式是delete 释放之前由普通new 分配的内存。通过放置 new,您不必使用由普通 new 分配的内存,因此有可能没有被分配普通的newdelete无法处理。

关于c++ - 可以在分配有新位置的指针上调用 delete 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7058457/

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