【发布时间】:2018-02-26 00:43:20
【问题描述】:
我已经像这样实现了新的展示位置:
inline void* operator new (std::size_t n, void* ptr) {return ptr;};
我使用的环境没有标准库,所以我需要放置新的。使用这个placement new 操作符的语法应该是这样的:
::new (pointer) int();
出于什么原因我需要尺寸?我的 std::size_t 是无符号整数。我这样做的原因是没有可用的动态内存分配,我从池中获取所有指针。
【问题讨论】:
-
因为标准规定函数应该是这样的。
-
因为 C++ 标准要求
operator new()或operator new []()的所有重载都接受std::size_t作为第一个参数(并将传递正在构造的任何大小)。新展示位置只是相应operator new()或operator new []()的重载。推理可能是允许任何此类函数需要分配内存,在这种情况下,他们需要知道大小。没有什么可以阻止您的重载版本忽略 size 参数。 -
@Peter 这看起来是个不错的答案。
-
inline void* operator new (std::size_t n, void* ptr) {return ptr;};是我新操作符的实现。编译器给我一个错误:错误:'operator new' 将类型'size_t'('unsigned int')作为第一个参数[-fpermissive]。 -
标准还说 operator new(size_t,void*) 的放置形式是不可替换的,也许你应该声明一个重载,例如 operator new(size_t,void*,my_type) 并使用它表达式:
new (ptr,my_type{}) int()。如果您不这样做,并将您的代码与可能产生意外的其他代码链接起来。
标签: c++ memory-management new-operator