C++参考页面列出了针对global new operators的8 类特定过载。其中四个是为2017版C++添加的。如果我为一个类编写运算符new和delete,是否必须编写所有的重载?
类专用分配功能
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)
该网站还列出了10个类特定版本global delete operators,其中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++类,做我需要重载那些所有?我忽略了可替换的全球运营商,因为我只写类专用运营商。
This other question provides info on writing ISO compliant new and delete operators,但并没有说我是否应该重载所有这些,或只是一些。
对this question about class specific new and delete operators的回答并未说明是否全部或部分替换。
如果您可以提供来自C++标准的引文或C++内存专家的评论,这将有所帮助。
对我来说似乎[这个答案](https://stackoverflow.com/a/7151831/366904)有你正在寻找的信息。 –
好吧,如果你想使用自定义分配方案,我认为对所有进行实际分配和释放操作的操作符进行重载是谨慎的。那,或者明确地删除那些你不想支持的。 – StoryTeller
你可以使用'template'来定义'new'和'delete'的位置。这将允许编译器生成类型专用代码。 –