全局重载 delete[] 未在第三方库中调用

Global overload delete[] not called in third-party libraries

本文关键字:第三方 调用 重载 delete 全局      更新时间:2023-10-16

我正在尝试了解C++中的内存池,以获得更好的速度和调试功能。我一直在遵循这里找到的方法:http://oroboro.com/overloading-operator-new/。所以我重载了newnew[]deletedelete[]如下:

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的定义可能是错误的。它们必须返回有效的指针或引发异常。不允许返回空指针。