一个库中的函数调用另一个库中的重写delete[]
Function in one library calls overridden delete[] in another library
我用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[]"调用"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
注释。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 运算符C++ "delete []"仅删除 2 个前值
- 在 C++ 中用派生类型重写成员函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 方法重写线程C++中的概念
- 为重写std::exception的库生成swig接口时出错
- g++用户定义的动态链接库上的全局new和delete运算符
- 为什么"delete"关键字不删除节点?
- 如何强制从重写方法调用重写的方法基方法?
- 用于C++的静态二进制检测或二进制重写工具和框架
- 如何将 if else 语句重写为 switch 语句
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 在OSX 10.8.2中重写"new"和"delete"时出错
- 重载、重写和替换new/delete的限制是什么
- 为特定类重写new和delete操作符的原因是什么?
- c++是delete操作符重写内存
- 是否存在一个尊重重写的new/delete的C++分配器
- 重写派生类中的运算符 new/delete
- 一个库中的函数调用另一个库中的重写delete[]