【发布时间】:2014-10-25 03:22:33
【问题描述】:
我正在尝试了解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));
}
【问题讨论】:
标签: c++ memory-management