从成员算子删除调用全局算子删除背后的想法是什么?

What is idea behind calling calling global operator delete from member operator delete?

提问人:user1244932 提问时间:5/24/2023 更新时间:5/24/2023 访问量:90

问:

在Qt的ExternalRefCountData(QSharedPtr实现的一部分)中 https://codebrowser.dev/qt5/qtbase/src/corelib/tools/qsharedpointer_impl.h.html#159

我找到了代码:

  inline void operator delete(void *ptr) { ::operator delete(ptr); }

此代码的目的是什么?

我想如果没有这条线,事情会是一样的:

auto *d = new ExternalRefCountData;
delete d;//(2)

不带第 (2) 行应 直接打电话,那没用吗? 还是我错过了什么?ExternalRefCountData::operator delete::operator delete(ptr);ExternalRefCountData::operator delete

C++ C++11 删除运算符

评论

0赞 Ted Lyngmo 5/24/2023
添加它的原因是部分恢复删除该运算符的另一个提交,否则 ASAN 会抱怨 new/delete 不匹配。不幸的是,导入 github 并没有透露添加它的原始原因。它与非常有趣的.inline void operator delete(void *, void *) { }
0赞 Ted Lyngmo 5/24/2023
...并且 cppreference 说“运算符 delete (13,14) 的标准库放置形式无法替换,只有在放置 new-expression 不使用 ::new 语法时才能自定义,通过提供具有匹配签名的特定于类的放置删除 (25,26):void T::operator delete(void*, void*)”,所以也许它们以某种方式协同工作。
0赞 Red.Wave 5/24/2023
@TedLyngmo 没有过载。为什么删除它们会检测到不匹配?!现在不匹配正在发生。operator new
0赞 Ted Lyngmo 5/24/2023
@Red.Wave “There's no operator new overload” - 不,有一个特定于类的位置。我无法回答检测到的 ASAN 不匹配。我只是从提交消息中获取了文本。delete
1赞 Ted Lyngmo 5/24/2023
@Red.Wave可能是。我想人们必须深入研究 Qts asan 启用的测试才能更深入地挖掘原因,也许还会写一份关于 asan 的错误报告。

答: 暂无答案