【问题标题】:Correct way of implementing placement new in C++在 C++ 中实现新布局的正确方法
【发布时间】: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


【解决方案1】:

我打算这只是一个评论,但按照 melpomene 的建议,这是一个答案....

C++ 标准要求operator new()operator new []() 的所有重载都接受std::size_t 作为第一个参数(并且实现将确保正在构造的任何内容的大小都通过该参数传递)。

新展示位置只是相应operator new()operator new []() 的重载。因此,它必须是那种形式。

推理可能是考虑到任何此类重载函数需要分配内存的可能性,在这种情况下,它需要访问大小信息。

没有什么可以阻止您的重载版本忽略大小参数 - 这可能解释了为什么标准不允许在没有该参数的情况下重载 operator new()operator new[]()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多