C++ 中全局“operator delete”的两种变体是什么?

What are two variants of global `operator delete` in C++?

抱歉,如果我问一些关于 C++ 的琐碎问题,但我没有找到合适的答案。

看起来 C++ 中至少有两个版本的 ::operator delete,特别是 Clang 和 GCC 使用不同的版本,如下所示:

#include <iostream>
#include <memory>

void operator delete(void *) noexcept { std::cout << "delete1 "; }
void operator delete(void *, std::size_t) noexcept { std::cout << "delete2 "; }

int main()
{
    auto x = std::make_shared<int>();
}

Clang 打印 delete1 并且 GCC 打印 delete2 ( https://gcc.godbolt.org/z/TWavo37dG ).

因此,如果编写的程序必须与任何 C++ 编译器兼容,则必须提供两个函数版本,对吗?

至少你可以使用 delete(void*) 版本。两个编译器都可以使用它(如果没有任何其他版本)。 查看更多:https://en.cppreference.com/w/cpp/memory/new/operator_delete

大小删除的标准库实现调用未大小化版本。

请注意 gcc -Wextra generates a warning 如果您覆盖一个而不是另一个。

大小删除:

Called instead of (1-2) if a user-defined replacement is provided, except that it's unspecified whether (1-2) or (5-6) is called when deleting objects of incomplete type and arrays of non-class and trivially-destructible class types. A memory allocator can use the given size to be more efficient.

让编译器自由决定它在某些情况下的行为。

你可以通过passing -fsized-deallocation让clang调用sized delete。我不知道没有该标志的 clang 是否符合标准,也不知道为什么他们需要该标志来支持大小删除。

但这至少是获得类似行为的解决方法。