0

このクラス ctor はメモリ リークを起こしています。何が起こっているのかわかりません。どのように私は知っていますか?ctor の 2 行目をコメントアウトすると、リークはなくなります。

template< class T, int fixedSize >
class Resource_Cache{

private:

    ID3D11Device * m_pDeviceRef;    // the one that actually can create stuff

    UINT m_iCurrentIndex;           // next slot to be allocated, also the ID of the resources
    //UINT m_nFreedSlots;               // how many freed slot there are?

    T* m_cache[fixedSize];          // the container per se

    struct SlotInfo{

        UINT nUseCount;
        Resource_Descriptor<T> desc;

    } m_slotsInfo[fixedSize];//use a hashtable<desc,index on m_cache>;


    Resource_Cache();   //denied default ctor

public:

    Resource_Cache( ID3D11Device * pDevice_p ): m_pDeviceRef(pDevice_p), m_iCurrentIndex(0){

        memset(m_cache, NULL, fixedSize*sizeof(T*));
        memset( m_slotsInfo, 0, fixedSize*sizeof(SlotInfo));    // zero slotsInfo memory(CAUSING LEAKS)
    }
 ...

単純なことかもしれませんが、私は無知です..

  • 編集して答える - PermanentGuestが言ったように:いいえ。基本型には問題はありません。ただし、Resource_Descriptor の型 T に memset によってコンストラクター (文字列など) にメモリを割り当てる実装がある場合、そのクラスの内部ポインターを NULL にリセットすることになり、そのデストラクタがメモリを削除する機会を拒否します。– PermanentGuest

std::string が問題で、解決しました。

4

1 に答える 1

1

それ以外の

Resource_Cache( ID3D11Device * pDevice_p ): m_pDeviceRef(pDevice_p), m_iCurrentIndex(0){

        memset(m_cache, NULL, fixedSize*sizeof(T*));
        memset( m_slotsInfo, 0, fixedSize*sizeof(SlotInfo));    // zero slotsInfo memory(CAUSING LEAKS)
    }

行う

Resource_Cache( ID3D11Device * pDevice_p )
    : m_pDeviceRef( pDevice_p )
    , m_iCurrentIndex()
    , m_cache()
    , m_slotsInfo()
{}

これは、メモリ リークが原因であると結論付けた症状、またはメモリ リークがある場合はメモリ リークが原因であると結論付けた症状を治すことはできないと確信していますが、少なくともゼロ化を行うことによって、あなたが固執した考えられる原因を排除します ( (安全でない) C ではなく、安全な) C++。

まあ、指定されていないため、まったく説明されていないため、Resource_Descriptor<T>実際に問題が解決する可能性があります。しかしmemset、それが POD でなかったら、あなたは使っていなかったでしょう。または、おそらくあなたはそうするでしょうか?

于 2012-07-24T14:13:25.370 に答える