如果我有一个本机 C++ 程序并查看它的初始“私有字节”内存计数器,为什么在创建并删除对象后它不会返回到其原始值?
例如,如果我有一个有两个按钮的应用程序(32位,Native C++ MFC)。
其中一个在循环中分配一个对象的 1,000,000 个实例,然后另一个按钮则删除这些相同的对象。
如果我查看进程的专用字节计数器,我会得到以下 3 个值:
.
描述......................私有字节数
===================================
应用程序已启动......................1,608K
对象。已创建........33,176K
对象。已删除......................2,520K
912K(2520-1608)泄漏?
假设我的代码没有泄漏内存,我相信这不是为什么私有字节计数不会返回到EXACT初始值?
如果我再次单击这两个按钮(没有重新启动程序)(第一个按钮创建了另外 1,000,000 个对象),第二个按钮删除了它们,我会得到以下结果:
对象。已创建........33,472K
对象。已删除......................2,552K
新泄漏 (2552-2520) = 32K
我只是在寻找关于为什么内存不会恢复到原始值的解释。
示例代码(删除了一些生成的代码以减少噪音):
class Person
{
public:
Person(void);
~Person(void);
Person* Next;
int A;
int B;
int C;
int D;
};
class Cdelme_MFC2005_MemoryTestDlg : public CDialog
{
// some code stripped out here to simplify reading.
Person* m_PeopleList_First;
Person* m_PeopleList_Last;
public:
afx_msg void OnBnClickedButtonAllocate();
afx_msg void OnBnClickedButtonFree();
};
Cdelme_MFC2005_MemoryTestDlg::Cdelme_MFC2005_MemoryTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(Cdelme_MFC2005_MemoryTestDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_PeopleList_First = NULL;
m_PeopleList_Last = NULL;
}
void Cdelme_MFC2005_MemoryTestDlg::OnBnClickedButtonAllocate()
{
if ( m_PeopleList_First == NULL )
{
m_PeopleList_First = new Person();
m_PeopleList_First->A = 0;
m_PeopleList_Last = m_PeopleList_First;
}
int MAX = 1000000;
for (int i = 0; i <MAX ; i++)
{
Person* p = new Person();
p->A = i;
m_PeopleList_Last->Next = p;
m_PeopleList_Last = p;
}
}
void Cdelme_MFC2005_MemoryTestDlg::OnBnClickedButtonFree()
{
Person* p = m_PeopleList_First;
while ( p != NULL )
{
Person* pNext = p->Next;
delete p;
p = pNext;
}
m_PeopleList_First = NULL;
m_PeopleList_Last = NULL;
}