gpt4 book ai didi

c++ - 一个库中的函数调用另一个库中的重写 delete[]

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:46 25 4
gpt4 key购买 nike

我使用 googletest 编写了一个测试程序。该程序链接了两个库,gtestd.libutil.lib,它们都是使用 VS2010 和/MDd 构建的

util.lib 中,C++ 运算符 new 和 delete 被覆盖。

inline  void * _cdecl operator new[]( size_t cb )
{
Assert(cb <= UINT_MAX);
return MemAlloc((DWORD)cb);
}

inline void __cdecl operator delete[]( void * pv )
{
MemFree(pv);
}

现在 gtestd.lib 中的文件 gtest-filepath.cc 发生了奇怪的事情

void FilePath::Normalize() {
.....
const char* src = pathname_.c_str();
char* const dest = new char[pathname_.length() + 1];

.....
delete[] dest;
}

“new[]”调用了“msvcr100d.dll!operator new[]”,但是“delete[]”调用了在 util.lib 中定义的“mytestapp.exe!operator delete[]”

我希望 new[]delete[] 都将调用 VS 运行时库,因为这是 gtestd.lib 链接到的内容。但无论如何,我不明白为什么 new[] 调用 VS 运行时库,但 delete[] 调用覆盖的库。

最佳答案

你的程序有未定义的行为,因为你违反了 7.1.2 中的规则:

An inline function shall be defined in every translation unit in which it is odr-used and shall have exactly the same definition in every case (3.2).

从这些定义中删除 inline 关键字。

您也没有遵循 18.6.1 中的指南,该指南指出用户代码可以替换数组 ::operator new[](),但这样做时,应提供以下所有内容:

void* operator new[](std::size_t size);
void operator delete[](void* ptr) noexcept;
void operator delete[](void* ptr, std::size_t size) noexcept;

您未能提供双参数 ::operator delete[] 重载,当构造函数抛出时使用,并且您没有正确的 noexcept 注释您的替换 ::operator delete[] 版本。

关于c++ - 一个库中的函数调用另一个库中的重写 delete[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30309296/

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