gpt4 book ai didi

c++ - C++ 中全局 `operator delete` 的两种变体是什么?

转载 作者:行者123 更新时间:2023-12-04 07:21:57 26 4
gpt4 key购买 nike

抱歉,如果我问了一些关于 C++ 的小问题,但我没有找到合适的答案。
看起来 ::operator delete 至少有两个版本在 C++ 中,特别是 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>();
}

叮当印 delete1和 GCC 打印 delete2 ( https://gcc.godbolt.org/z/TWavo37dG )。
因此,如果编写的程序必须与任何 C++ 编译器兼容,那么必须提供两个函数版本,对吗?

最佳答案

大小删除的标准库实现调用未大小版本。
注意 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 调用大小删除.我不知道没有那个标志的 clang 是否符合标准,也不知道为什么他们需要那个标志来支持大小删除。
但这至少是获得类似行为的一种解决方法。

关于c++ - C++ 中全局 `operator delete` 的两种变体是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68442698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com