1. 程式人生 > >C++記憶體管理之結構體記憶體釋放

C++記憶體管理之結構體記憶體釋放

    C++中使用new和delete申請和釋放記憶體空間,二者是成對出現的,缺一不可。使用new開闢的記憶體空間位於堆中,只能通過delete釋放,這與區域性變數不同,區域性變數儲存在棧中,變數生存週期結束後其記憶體也隨之釋放。
    結構體中成員變數中存在指標的,其記憶體釋放遵循從裡向外的原則,即先釋放成員變數的記憶體,然後在釋放結構體指標。由於C++中允許結構體中使用建構函式和解構函式,建構函式對成員資料進行初始化,解構函式對記憶體進行清理。解構函式在對結構體進行釋放時呼叫,首先釋放解構函式中的成員變數記憶體,然後釋放結構體指標記憶體。

struct _STU_FamilyInfo
{
	int nAge;
};

struct _STU_StudentINFO
{
	char* pstrName;
	int nAge;
	int nFamilyMember;
	_STU_FamilyINFO* pstuInfo;
	LPVOID lpExtInfo;

	_STU_StudentINFO()
	{
		pstrName = NULL;
		nAge = 0;
		nFamilyMember = 0;
		lpExtInfo = NULL;
		pstuInfo = NULL;
	};

	~_STU_StudentINFO()
	{
		if(pstrName)
		{
			delete []pstrName;
			pstrName = NULL;
		}

		if(pstuInfo)
		{
			delete []pstuInfo;
			pstuInfo = NULL;
		}
	};
};


_STU_StudentINFO* pstuStudent = new _STU_StudentINFO;
pstuStudent->pstrName = "Sunny";
pstuStudent->nAge = 27;
pstuStudent->nFamilyMember = 2;
_STU_FamilyInfo* pstuFamilyMember = new _STU_FamilyInfo[2];
//...... 成員變數賦值
pstuStudent->lpExtInfo = new char[256];
memccpy(pstuStudent->lpExtInfo,"無其他說明",256)


// 記憶體釋放
if( pstuStudent->lpExtInfo )
{
	delete []pstuStuden->lpExtInfo;
	pstuStudent->lpExtInfo = NULL;
}

if(pstuStudent)
{
	delete pstuStudent;
	pstuStudent = NULL;
}
    由於lpExtInfo為LPVOID型別,僅代表一個地址值,是一個不確定的型別,在使用過程中需要經過型別轉換,因此在結構體的解構函式中,不能對其進行釋放,必須在程式中根據使用的型別進行顯示的釋放。
    成員函式的其他記憶體在呼叫結構體指標的釋放函式時,自動呼叫解構函式進行記憶體釋放,也就是其生命週期結束。