C++ 将DEBUG_NEW与D3DXMATRIXA16一起使用
我目前正在实施泄漏检测,如下所述: 使用以下宏,我使用DEBUG_new重新定义了new关键字,如本文所述:C++ 将DEBUG_NEW与D3DXMATRIXA16一起使用,c++,memory-leaks,operator-overloading,directx,C++,Memory Leaks,Operator Overloading,Directx,我目前正在实施泄漏检测,如下所述: 使用以下宏,我使用DEBUG_new重新定义了new关键字,如本文所述: #ifndef DBG_NEW #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ ) #define new DBG_NEW #endif 现在,我在项目中使用了大量DirectX代码,对new的调用目前无法编译。这在创建以下数组时发生: 这是引发的编译器错误: 错误C2660:“\u
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
现在,我在项目中使用了大量DirectX代码,对new
的调用目前无法编译。这在创建以下数组时发生:
这是引发的编译器错误:
错误C2660:“\u D3DXMATRIXA16::operator new[]”:函数不接受4个参数
我找到了\u D3DXMATRIXA16
的定义,并在d3dx9math.h
中找到了它:
#if _MSC_VER >= 1300 // VC7
#define D3DX_ALIGN16 __declspec(align(16))
#else
#define D3DX_ALIGN16 // Earlier compiler may not understand this, do nothing.
#endif
typedef struct _D3DXMATRIXA16 : public D3DXMATRIX
{
_D3DXMATRIXA16() {}
_D3DXMATRIXA16( CONST FLOAT * );
_D3DXMATRIXA16( CONST D3DMATRIX& );
_D3DXMATRIXA16( CONST D3DXFLOAT16 * );
_D3DXMATRIXA16( FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14,
FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24,
FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34,
FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44 );
// new operators
void* operator new ( size_t );
void* operator new[] ( size_t );
// delete operators
void operator delete ( void* ); // These are NOT virtual; Do not
void operator delete[] ( void* ); // cast to D3DXMATRIX and delete.
// assignment operators
_D3DXMATRIXA16& operator = ( CONST D3DXMATRIX& );
} _D3DXMATRIXA16;
typedef D3DX_ALIGN16 _D3DXMATRIXA16 D3DXMATRIXA16, *LPD3DXMATRIXA16;
编译器是VS2013,因此D3DX_ALIGN16被定义为\u declspec(align(16))
现在删除new
的定义显然可以解决这个问题,但是如果我怀疑此代码周围有内存泄漏,那么这样做有什么意义呢
我不确定这里发生了什么。有没有办法绕过这个问题?我仍然希望能够在这里调试分配。declspec(align(16))不应该是问题所在。这对于对齐的DirectX向量类型是正常的。您是否处于调试模式?您是否像示例中那样将其包装在#ifdef_调试中?我认为这只适用于调试模式(定义了_debug),否则它将无法理解。如果失败了,这里有一个万岁玛丽:实际上写一个新的。还要注意中讨论的问题:@mock_blatt
new
正在我的include部分末尾的DEBUG_new
中定义,下面没有任何include。另外,不在发布版本中定义它也不是问题,调试和发布版本都无法编译此代码。虽然我刚刚发现D3DXMATRIXA16重载了new
和delete
操作符(参见我的编辑)。因此,在这里做一些事情是不可能的,对吗?@Vinzenz使用这样的定义(比如DBG_NEW)需要class\struct不重写NEW/delete操作符。否则,class\struct必须实现运算符new(size\u t nSize,LPCSTR lpszFileName,int nLine)代码>和运算符删除(void*p,LPCSTR lpszFileName,int-nLine)代码>最好的解决方案是不要将DEBUG_NEW与DX一起使用。@23W是的,这个问题太老了。我通过在关键位置取消定义和重新定义调试新定义来解决问题。它很凌乱,但很有效,可能会将其作为一个答案发布。_uudeclspec(align(16))不应该是问题所在。这对于对齐的DirectX向量类型是正常的。您是否处于调试模式?您是否像示例中那样将其包装在#ifdef_调试中?我认为这只适用于调试模式(定义了_debug),否则它将无法理解。如果失败了,这里有一个万岁玛丽:实际上写一个新的。还要注意中讨论的问题:@mock_blattnew
正在我的include部分末尾的DEBUG_new
中定义,下面没有任何include。另外,不在发布版本中定义它也不是问题,调试和发布版本都无法编译此代码。虽然我刚刚发现D3DXMATRIXA16重载了new
和delete
操作符(参见我的编辑)。因此,在这里做一些事情是不可能的,对吗?@Vinzenz使用这样的定义(比如DBG_NEW)需要class\struct不重写NEW/delete操作符。否则,class\struct必须实现运算符new(size\u t nSize,LPCSTR lpszFileName,int nLine)代码>和运算符删除(void*p,LPCSTR lpszFileName,int-nLine)代码>最好的解决方案是不要将DEBUG_NEW与DX一起使用。@23W是的,这个问题太老了。我通过在关键位置取消定义和重新定义调试新定义来解决问题。虽然很凌乱,但很有效,可能会将其作为答案发布。
#if _MSC_VER >= 1300 // VC7
#define D3DX_ALIGN16 __declspec(align(16))
#else
#define D3DX_ALIGN16 // Earlier compiler may not understand this, do nothing.
#endif
typedef struct _D3DXMATRIXA16 : public D3DXMATRIX
{
_D3DXMATRIXA16() {}
_D3DXMATRIXA16( CONST FLOAT * );
_D3DXMATRIXA16( CONST D3DMATRIX& );
_D3DXMATRIXA16( CONST D3DXFLOAT16 * );
_D3DXMATRIXA16( FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14,
FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24,
FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34,
FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44 );
// new operators
void* operator new ( size_t );
void* operator new[] ( size_t );
// delete operators
void operator delete ( void* ); // These are NOT virtual; Do not
void operator delete[] ( void* ); // cast to D3DXMATRIX and delete.
// assignment operators
_D3DXMATRIXA16& operator = ( CONST D3DXMATRIX& );
} _D3DXMATRIXA16;
typedef D3DX_ALIGN16 _D3DXMATRIXA16 D3DXMATRIXA16, *LPD3DXMATRIXA16;