如果我有一个本地C++程序并查看它的初始“专用字节”内存计数器,为什么在创建对象并删除对象后它不会回到它的原始值?为什么进程的“Private Bytes”内存计数器永远不会回到它的原始值?
例如,如果我有一个应用程序(32位,本机C + + MFC),有两个按钮。 一个在循环中分配一个对象的1,000,000个实例,然后另一个按钮则删除那些相同的对象。
如果我看看我的专用字节计数器的过程,我有以下3个值:
。
说明..........专用字节数
============= =================== ===
App Started ................. 1,608K
Objects。创建........ 33,176K
对象。删除.......... 2,520K
泄漏912K(2520-1608)?
假设我的代码没有泄漏内存,我相信这不是为什么专用字节数不会回到EXACT初始值?
如果我再上两个按钮点击(没有重新启动的程序)(第一按钮创建另一个百万对象)和第二删除它们我有这样的:
对象。创建........ 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;
}
'Person'构造函数将'Next'设置为'NULL'吗?如果不是,链表中的最后一项将指向垃圾。我不认为这会导致你的内存泄漏。 – Nate 2010-10-12 16:01:06
是的,它的确如此。对不起,关于这个ommision – kevin 2010-10-12 16:05:40