【发布时间】:2018-01-14 03:21:29
【问题描述】:
C++ 参考页面列出了 global new operators 的 8 个类特定重载。其中四个是为 2017 版 C++ 添加的。
类特定的分配函数
void* T::operator new ( std::size_t count );
void* T::operator new[]( std::size_t count );
void* T::operator new ( std::size_t count, std::align_val_t al ); // (since C++17)
void* T::operator new[]( std::size_t count, std::align_val_t al ); // (since C++17)
类特定的布局分配函数
void* T::operator new ( std::size_t count, user-defined-args... );
void* T::operator new[]( std::size_t count, user-defined-args... );
void* T::operator new ( std::size_t count,
std::align_val_t al, user-defined-args... ); // (since C++17)
void* T::operator new[]( std::size_t count,
std::align_val_t al, user-defined-args... ); // (since C++17)
该网站还列出了 global delete operators 的 10 个类特定版本,其中 4 个是在 2017 年推出的。
类特定的常用释放函数
void T::operator delete ( void* ptr );
void T::operator delete[]( void* ptr );
void T::operator delete ( void* ptr, std::align_val_t al ); // (since C++17)
void T::operator delete[]( void* ptr, std::align_val_t al ); // (since C++17)
void T::operator delete ( void* ptr, std::size_t sz );
void T::operator delete[]( void* ptr, std::size_t sz );
void T::operator delete ( void* ptr, std::size_t sz, std::align_val_t al ); // (since C++17)
void T::operator delete[]( void* ptr, std::size_t sz, std::align_val_t al ); // (since C++17)
类特定的放置释放函数
void T::operator delete ( void* ptr, args... );
void T::operator delete[]( void* ptr, args... );
如果我使用 new 和 delete 运算符编写 C++ 类,我需要重载 all 吗?我忽略了可替换的全局运算符,因为我只编写特定于类的运算符。
This other question provides info on writing ISO compliant new and delete operators,但没有说我是否应该重载所有这些,或者只是一些。
this question about class specific new and delete operators 的答案并没有说明是替换全部还是只替换其中的一部分。
如果您可以提供来自 C++ 标准或 C++ 内存专家的 cmets 的引用,那将有所帮助。
【问题讨论】:
-
在我看来,this answer 拥有您正在寻找的信息。
-
好吧,如果你想使用自定义分配方案,我认为重载所有执行实际分配和释放的运算符是谨慎的。那个,或者明确删除那些你不想支持的。
-
您可以使用
template来定义位置new和delete。这将允许编译器生成类型专用代码。 -
@CodyGray 谢谢,Cody,但这确实不回答了我的问题。它说 why 编写新的运算符,而不是 which 重载。它说重载特定类以提高性能或减少碎片。它没有说明是否写一些就足够了,或者是否所有都是必要的。
标签: c++ memory-management new-operator delete-operator