gpt4 book ai didi

c++ - 使用 MINGW gcc 编译时,不会为 std::string 调用重载的 new 运算符

转载 作者:行者123 更新时间:2023-12-01 12:32:21 29 4
gpt4 key购买 nike

该程序(使用选项 -std=c++17 编译)

#include <stdio.h>
#include <string>
void* operator new(std::size_t nrOfBytes) {
printf("allocate %zd bytes on heap\n", nrOfBytes);
void* p = malloc(nrOfBytes);
if (p) {
return p;
} else {
throw std::bad_alloc{};
}
}
int main() {
// new operator is called when compiled with Clang or MSVS or GCC
int* i = new int;
delete i;
// new operator is not called when compiled with GCC
// but is called with Clang and MSVS
std::string str(2000, 'x');
return 0;
}

当用 Clang 或 MSVS 编译时,打印:

allocate 4 bytes on heap

allocate 2016 bytes on heap



但是,当使用 GCC(Windows 上的 MSYS 提供的 9.2.0 版)编译时,它只打印:

allocate 4 bytes on heap



我知道 GCC/libc++ 中的短字符串优化,但是对于短字符串来说 2000 个字符不是太多吗?这完全是 SSO 的问题吗?

最佳答案

似乎 GCC 没有(或不能?)实现全局 operator new 的替换。和 operator delete当 Windows 上涉及动态库时正确。

查看错误报告,例如77726 , 8212281413 .

在你的情况下 std::string的构造函数和/或 std::allocator<char>::allocate似乎位于标准库的动态库中,所以operator new它使用没有被正确更换。

关于c++ - 使用 MINGW gcc 编译时,不会为 std::string 调用重载的 new 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59721160/

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