gpt4 book ai didi

c++ - 安置新的和异常(exception)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:10 24 4
gpt4 key购买 nike

“placement new”运算符声明如下:

void* operator new (std::size_t size, void* ptr) noexcept;

但是虽然它不涉及任何实际分配,因此消除了错误的分配异常,但指针仍然可能指向错误的位置,在这种情况下,人们会期望得到一个范围或溢出/下溢错误,但是它被声明为 noexcept 的事实不会直接终止执行吗?

这是否也意味着在 C++11 之前放置 new 将抛出并尝试处理 std::unexpected 而不是直接处理 std::set_unexpected崩溃?

“以防万一”,难道不应该有大量的 placement new 吗?

最佳答案

使用放置语法的要点是实现非标准分配,因此通常需要非标准释放。因此采取的行动取决于所使用的分配器。

您的工作是为新员工提供正确的地址。

根据评论进行编辑:-

#include <new>        // Must #include this to use "placement new"
#include "Fred.h" // Declaration of class Fred

void someCode()
{
char memory[sizeof(Fred)]; // Line #1 //Allocate enough memory.
void* place = memory; // Line #2 // There's no need for this.

Fred* f = new(place) Fred(); // Line #3 (see "NOTE" below)
// The pointers f and place will be equal

...
}

注意:您将全权负责传递给“placement new”运算符的指针指向一个足够大的内存区域,并且与您正在创建的对象类型正确对齐。编译器和运行时系统都不会尝试检查您是否做对了。如果您的 Fred 类需要在 4 字节边界上对齐,但您提供了一个未正确对齐的位置,那么您可能会遇到严重的灾难。

简而言之,这意味着你应该小心使用 placement new 或者如果你像我一样永远不要使用它:)

希望这能消除您的疑虑。

关于c++ - 安置新的和异常(exception),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26699326/

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