C++ 将DEBUG_NEW与D3DXMATRIXA16一起使用

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

我目前正在实施泄漏检测,如下所述:

使用以下宏,我使用DEBUG_new重新定义了new关键字,如本文所述:

#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_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是的,这个问题太老了。我通过在关键位置取消定义和重新定义调试新定义来解决问题。虽然很凌乱,但很有效,可能会将其作为答案发布。
#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;