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'的位置。這將允許編譯器生成類型專用代碼。 –