以下代码与clang(x86_64-pc-linux-gnu 上的版本5.0.0-3~16.04.1)和gcc(9.2.0 )。
void operator delete(void* ptr) noexcept {
std::cout << "overloaded delete" << std::endl;
free(ptr);
}
int main() {
int* pint = new int;
delete pint; // clang doesn't go through overloaded operator delete, gcc does
}
gcc 通过重载的 operator delete
而 clang 则避免使用它全局删除
。
(当添加重载operator new
时,两个编译器都会同意并遍历两个重载版本)。
最佳答案
编译器可以使用new
优化分配,并完全省略对全局可替换operator new
和operator delete
的调用,即使它们有副作用,请参阅 [expr.new]/10和 [expr.delete]/7.1 C++17 标准草案。
如果您在没有 -O2
标志的情况下进行编译,您将看到两个编译器都打印出您的消息,并且 gcc trunk 也会忽略启用优化的分配。
如果编译器没有删除分配/释放函数调用,我会假设您的operator delete
具有未定义的行为,因为您无法保证您正在传递的指针是由如果不是,malloc
并对其调用 free
则具有未定义的行为。
您需要始终替换operator new
和operator delete
。
关于c++ - 重载运算符delete而不重载new时,什么是正确的行为? gcc 和 clang 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59373334/