在 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[]()