首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当重载操作符删除而不重载新的操作时,正确的行为是什么?gcc和clang不同

当重载操作符删除而不重载新的操作时,正确的行为是什么?gcc和clang不同
EN

Stack Overflow用户
提问于 2019-12-17 11:29:30
回答 1查看 151关注 0票数 5

以下代码与clang (在x86_64-pc上的5.0.0-3~16.04.1版本)和gcc (9.2.0)的行为不同。

代码语言:javascript
复制
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则避免使用global delete

(当添加重载的operator new时,两个编译器都同意并通过两个重载版本)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-17 11:43:05

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

如果您没有使用-O2标志进行编译,您将看到您的消息都是用编译器打印出来的,gcc主干也省略了启用优化的分配。

如果编译器没有删除分配/去分配函数调用,我将假设您的operator delete具有未定义的行为,因为您无法保证您要传递的指针是由malloc分配的,如果没有,则调用free具有未定义的行为。

您需要始终同时替换operator newoperator delete

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59373334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档