全局重载 delete[] 未在第三方库中调用
Global overload delete[] not called in third-party libraries
我正在尝试了解C++中的内存池,以获得更好的速度和调试功能。我一直在遵循这里找到的方法:http://oroboro.com/overloading-operator-new/。所以我重载了new
、new[]
、delete
,delete[]
如下:
inline void* operator new ( size_t size ) { return myAlloc( size ); }
inline void* operator new[] ( size_t size ) { return myAlloc( size ); }
inline void operator delete ( void* ptr ) { myFree( ptr ); }
inline void operator delete[]( void* ptr ) { myFree( ptr ); }
我喜欢第三方库被定向到这个版本的new
,但我遇到了一个问题。我正在制作一个使用 DXUT 的 DirectX 应用程序。我将DXUT与我的项目分开编译。最终它调用:
std::unique_ptr<D3D11_SUBRESOURCE_DATA[]> initData( new (std::nothrow) D3D11_SUBRESOURCE_DATA[ mipCount * arraySize ] );
一旦这个唯一的指针超出范围,它就会在调用 delete[] _Ptr
时崩溃,这没有通过我的重载运算符。我尝试通过在main
中添加int* dummy = new int[10]; delete[] dummy;
来调试内存池实现。构建项目给出了错误,但清洁建筑工作正常。令我惊讶的是,一切都正常,包括崩溃的DXUT线!
问题 1:当我添加修复问题的调试行时,究竟发生了什么?我想由于某种原因,我的运算符 delete[] 直到我在自己的应用程序代码中调用它才知道?这是保证解决问题还是只是运气不好?
问题2:我注意到new (std::nothrow) D3D11_SUBRESOURCE_DATA[ mipCount * arraySize ]
没有直接打电话给我的operator new[]
,而是最终打电话给我的operator new
(没有括号(。它仍然在指针上调用运算符delete[]
。这会带来问题吗?我是否必须添加适当的重载才能调用我的operator new[]
,或者此行为是否正常?
作为参考,调用的operator new[]
重载为:
void * __CRTDECL operator new[](::size_t count, const std::nothrow_t& x)
_THROW0()
{ // Try to allocate count bytes for an array
return (operator new(count, x));
}
问题1:当我添加调试行时,究竟发生了什么 解决了问题?我想由于某种原因,我的运算符 delete[] 不是 直到我在自己的应用程序代码中调用它才知道?这是有保证的吗 解决问题还是只是运气不好?
§3.2 [basic.def.odr]/p4:
应在以下每个翻译单元中定义内联函数: 它是 ODR 使用的。
听起来您的编译器没有为全局operator delete[]
生成代码,因为它没有在您的主翻译单元中使用并且被标记为inline
(这意味着编译器可以假设使用它们的任何翻译单元都会有它们的定义(。但是,单独编译的库没有这些函数的定义,您最终会使用标准库中的默认函数。使它们不inline
应该可以解决问题。
问题2:我注意到
new (std::nothrow) D3D11_SUBRESOURCE_DATA[ mipCount * arraySize ]
没有打电话给我operator new[]
直接,但最终打电话给我的operator new
(没有 括号(。它仍然在指针上调用运算符delete[]
。是否 这带来了一个问题?我是否必须添加适当的重载,例如 我的operator new[]
被调用还是这种行为很好?
operator new []
的抛出和非抛出版本的默认版本,以及operator new
的非抛出版本,都被指定为调用operator new
的抛掷版本来获取内存。所以你在那里很安全。但是,您的operator new
的定义可能是错误的。它们必须返回有效的指针或引发异常。不允许返回空指针。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在第三方函数调用之前同时运行线程
- P/调用第三方弹出窗口
- C#调用C 第三方DLL(无源)提出异常 - 不兼容PinVoke
- Unix C++第三方API调用
- 如何允许通过嵌入式 Python 解释器中调用的脚本导入第三方库
- 如何正确处理C++线程中永久挂起的第三方库调用
- COM互操作:如何使用ICustomMashaler调用第三方组件
- 全局重载 delete[] 未在第三方库中调用
- 调用第三方api,如amazon/ebay,使用c++获取产品详细信息
- 如何在第三方库调用的回调函数中传递/使对象/变量可访问
- 用于第三方库调用的c++ watchdog
- 为第三方库libA封装对malloc的调用.a,但不是为了libb
- 调用第三方可执行文件时调试分段错误