在 C++ 中实现 placement new 的正确方法
Correct way of implementing placement new in C++
我已经实现了这样的新展示位置:
inline void* operator new (std::size_t n, void* ptr) {return ptr;};
我使用的环境没有标准库所以我需要placement new。使用此放置新运算符的语法应如下所示:
::new (pointer) int();
为什么我需要尺寸?我的 std::size_t 是无符号整数。我这样做的原因是因为没有可用的动态内存分配,我从一个池中获取所有指针。
我原本打算这只是一个评论,但根据 melpomene 的建议,这是一个答案....
C++ 标准要求 operator new()
或 operator new []()
的所有重载都接受 std::size_t
作为第一个参数(并且实现将确保正在构造的任何内容的大小是通过该参数传递)。
新的展示位置只是相应 operator new()
或 operator new []()
的重载。因此,它需要采用这种形式。
推测的原因是考虑到任何此类重载函数需要分配内存的可能性,在这种情况下,它需要访问大小信息。
没有什么可以阻止您的重载版本忽略 size 参数 - 这可能解释了为什么标准不允许在没有该参数的情况下重载 operator new()
或 operator new[]()
。
我已经实现了这样的新展示位置:
inline void* operator new (std::size_t n, void* ptr) {return ptr;};
我使用的环境没有标准库所以我需要placement new。使用此放置新运算符的语法应如下所示:
::new (pointer) int();
为什么我需要尺寸?我的 std::size_t 是无符号整数。我这样做的原因是因为没有可用的动态内存分配,我从一个池中获取所有指针。
我原本打算这只是一个评论,但根据 melpomene 的建议,这是一个答案....
C++ 标准要求 operator new()
或 operator new []()
的所有重载都接受 std::size_t
作为第一个参数(并且实现将确保正在构造的任何内容的大小是通过该参数传递)。
新的展示位置只是相应 operator new()
或 operator new []()
的重载。因此,它需要采用这种形式。
推测的原因是考虑到任何此类重载函数需要分配内存的可能性,在这种情况下,它需要访问大小信息。
没有什么可以阻止您的重载版本忽略 size 参数 - 这可能解释了为什么标准不允许在没有该参数的情况下重载 operator new()
或 operator new[]()
。