牛骨文教育服务平台(让学习变的简单)
博文笔记

C++内存管理之结构体内存释放

创建时间:2017-08-23 投稿人: 浏览次数:1153

    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类型,仅代表一个地址值,是一个不确定的类型,在使用过程中需要经过类型转换,因此在结构体的析构函数中,不能对其进行释放,必须在程序中根据使用的类型进行显示的释放。
    成员函数的其他内存在调用结构体指针的释放函数时,自动调用析构函数进行内存释放,也就是其生命周期结束。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。