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

标签 c++ visual-studio-2010

我使用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/

相关文章:

c++ - 如何强制实现者做某事

c++ - 一个类作为另一个类的数据成员

c# - 隐藏新工作表选项卡

c++ - 我们应该序列化 std::chrono::duration 类还是 P.O.D. (普通旧数据)并且不需要序列化?

c++ - 带有 C 可变参数的 std::function,而不是模板化变量参数

c++ - 如何累积持续时间

visual-studio-2010 - VS2010开发服务器可以发邮件吗?

c++ - 生成项目文档

wcf - 为什么我的模块不在模块列表中?

c# - 命令 BuildOnlyProject 已禁用