我使用googletest编写了一个测试程序。该程序链接了两个库,gtestd.lib
和 util.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/