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

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,结构体内存的管理主要依赖于malloc和free函数。malloc函数用于分配内存空间,而free函数用于释放已分配的内存空间。当结构体中存在指针时,需要注意内存的分配和释放顺序,否则可能会导致内存泄漏。 在结构体中存在指针的情况下,首先要使用malloc为指针变量分配内存空间。然后,在释放结构体内存时,需要先释放指针变量所指向的内存空间,再释放结构体本身的内存空间。释放的顺序错误或者忘记释放都会导致内存泄漏。 举个例子,如果有一个结构体定义如下: typedef struct { char *p; int i; char ch<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++内存管理](https://blog.csdn.net/CS_COPy/article/details/123031978)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C/C++结构体动态内存的管理(malloc和free)](https://blog.csdn.net/weixin_45676049/article/details/107417457)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值