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 是否符合标准,也不知道为什么他们需要该标志来支持大小删除。
但这至少是获得类似行为的解决方法。
抱歉,如果我问一些关于 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 是否符合标准,也不知道为什么他们需要该标志来支持大小删除。
但这至少是获得类似行为的解决方法。