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;
}
成员函数的其他内存在调用结构体指针的释放函数时,自动调用析构函数进行内存释放,也就是其生命周期结束。