如何避免内存碎片?

时间:2015-03-04 07:07:40

标签: c++ memory-management mfc

我正在开发一个Visual C ++应用程序。有一个名为CMyObject的对象,如下所示:

    typedef CMap<UINT, UINT, void *, void*> CMyMap;

    class CMyObject
    {
    public:
        CMyMap *m_pMyMap;   
        …Some other member variables…
    }

CMyObject的某些实例包含地图,有些则不包含。因此,为了节省内存,我定义了一个指针m_pMyMap,并且仅当实例包含一个映射时才创建一个新的CMap对象。

当我测试我的应用程序时,随着CMyObject实例的增加,分配和释放的内存块数量也在增加。在此期间有很多碎片。为了防止这种情况,我尝试覆盖CMyObject和CMyMap的new / delete运算符。但仍然发现很多碎片。所以我尝试追踪CMap的MFC源代码。我发现CMap只是使用内部缓冲区来存储哈希表(m_pHashTable),如下所示:

    m_pHashTable = new CAssoc* [nHashSize];

对于每个哈希条目,它使用:

    P = (CPlex *)new BYTE[sizeof(CPlex) + nMax *cbElement];

分配空格。

我相信这两个可能是内存碎片的原因,并希望消除它们。但是,有没有办法覆盖代码的新/删除运算符,如:

    new CAssoc* [nHashSize]

    (CPlex *)new BYTE[sizeof(CPlex) + nMax *cbElement]

以便从我自己的内存管理器而不是默认堆中分配空格?

0 个答案:

没有答案