我正在开发一个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]
以便从我自己的内存管理器而不是默认堆中分配空格?