memset泄漏mem在模板类构造函数

时间:2012-07-24 13:50:59

标签: c++ templates constructor memory-leaks memset

这堂课正在泄露记忆,我不知道发生了什么。 我怎么知道?如果我注释掉第二条线,泄漏就会消失。

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是问题所解决的。

1 个答案:

答案 0 :(得分: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)
    }

DO

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

我很确定这个不会治愈你得出的症状是由于内存泄漏,或者内存泄漏(如果有的话),但至少它消除了你可能的原因'通过在(安全)C ++而不是(不安全)C中进行归零来确定。

哦,好吧,因为未说明的未描述的Resource_Descriptor<T>它可能实际上解决了这个问题。但如果那不是POD,你就不会使用memset,现在好吗?或者,也许你愿意?