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

Function in one library calls overridden delete[] in another library

本文关键字:重写 delete 另一个 函数调用 一个      更新时间:2023-10-16

我用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[]"调用"msvcr100 .dll! "Operator new[]",但"delete[]"调用"mytestapp.exe! "操作符delete[]"在util.lib

中定义

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

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

内联函数应在使用的每个翻译单元中定义,并在每种情况下具有完全相同的定义(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[]重载,当构造函数抛出时使用,并且您在替换的::operator delete[]版本上没有正确的noexcept注释。