【发布时间】:2013-07-05 08:26:37
【问题描述】:
假设我只想分配 256 字节的内存块
char * memory = new char[256];
比我使用placement new 创建一个FooBar 对象(sizeof(Foobar)
FooBar * obj = new (memory) FooBar();
会
delete obj; //this also calls the destructor of FooBar
删除所有 256 字节的内存?
标准是否保证整个“内存”缓冲区仅通过“删除 obj”来释放?或者它基于“FooBar”类型,因此该操作具有未定义的行为?
假设:FooBar 是内存缓冲区中唯一的对象。
这不是重复的问题,请先了解问题。这段代码的作用不是很明显。
【问题讨论】:
-
哦,是的。是否愿意阅读答案直到结束? “您不应该取消分配正在使用内存缓冲区的每个对象。相反,您应该
delete[]只释放原始缓冲区。” - 此外,答案下的第三条评论:“严格来说,在原始字符缓冲区上调用 delete[] 是未定义的行为。” -
我不介意你是否愿意 - 这个答案回答了你的问题。
-
@DarioOO 不确定这是否只是示例,但是在您自己的缓冲区中创建对象时,请注意对齐。 IE。从您的示例 FooBar * obj = new (&memory[15]) FooBar();将减慢您的程序速度,因为您的对象中任何大于 sizeof char 的值都不会正确对齐。
-
是的,placement new 有助于将对象与内存对齐,在这种情况下,为了简单起见,我将对象与 &memory[0] 对齐。顺便说一句,标准不允许我的代码(即使经过测试并在 MSVC 和 GCC 上工作)。
-
@Waldermort 啊,好吧 - 但我认为 DarioOO 在他写“标准不允许我的代码”时谈论的是删除的事情。
标签: c++ allocation placement-new delete-operator