c++ - 重载运算符delete而不重载new时,什么是正确的行为? gcc 和 clang 不同

标签 c++ gcc clang operator-overloading overload-resolution

以下代码与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 deleteclang 则避免使用它全局删除

(当添加重载operator new时,两个编译器都会同意并遍历两个重载版本)。

代码:http://coliru.stacked-crooked.com/a/0903bd53a8c04a9b

最佳答案

编译器可以使用new优化分配,并完全省略对全局可替换operator newoperator delete的调用,即使它们有副作用,请参阅 [expr.new]/10[expr.delete]/7.1 C++17 标准草案。

<小时/>

如果您在没有 -O2 标志的情况下进行编译,您将看到两个编译器都打印出您的消息,并且 gcc trunk 也会忽略启用优化的分配。

<小时/>

如果编译器没有删除分配/释放函数调用,我会假设您的operator delete具有未定义的行为,因为您无法保证您正在传递的指针是由如果不是,malloc 并对其调用 free 则具有未定义的行为。

您需要始终替换operator newoperator delete

关于c++ - 重载运算符delete而不重载new时,什么是正确的行为? gcc 和 clang 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59373334/

相关文章:

macos - macOS无法编译cpprestsdk

c++ - SOL2/C++ - Lua 初学者,是否可以在 Lua 文件之间传递 Lua 表?

c++ - 从共享对象调用外部类成员

c++ - 更改所有子类中父类(super class)变量的值

c++ - 通用 lambda、继承和尾随返回类型 : is this valid code?

c - 如何中断 gdb 中的多个 clang/ubsan 警告?

c++ - C++ lambda 不能正确选择重载函数吗?

C++ ostream 重载不起作用

在 C 中不使用 main() 编译和运行程序

c++ - GCC 不会优化整数算术表达式