C++ new delete(二)

本文探讨了C++中new和delete操作符的高级使用方法,强调它们并非必须成对出现在同一函数内,通过示例展示了如何在不同函数间传递和管理内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++基础遗漏:new和delete

我记得当年学习C++基础的时候,老师曾经告诉我们:一般来说new和delete要成对出现,在使用完new申请的内存后要马上释放。我相信持这种说法的人不止我们老师一个人,养成良好的内存使用习惯固然重要,但如果因此就认为new和delete必须成对出现,使用完new得到的空间后就要马上用delete释放的话,就有点“大材小用”了,相信C++提供这一由用户控制的内存控制方法也不是只限于如此的使用方法。

正确灵活的,或许也是“高级”的使用方法,是在A处使用new申请一块内存,用一个指针指pA向它,之后在B处用指针pB指向pA所指向的空间,释放指针pA本身,接着释放pB所指向的内存空间,最后释放指针pB本身。

以下的代码是本过程的一个例子:

#include<iostream.h>
#include<string.h>
char* ReverseString(char* pSourceStr,int nLength)
{
//这里在堆上动态申请了一个长度为nLength的内存空间pDescStr
char* pDescStr=new char[nLength]; 
for(int i=0;i<nLength;i++)
{
    pDescStr[nLength-i-1]=pSourceStr[i];
}
//结束前并没有释放pDescStr所指向的内存空间
return pDescStr;
//只是释放了pDescStr这个指针
}
void main()
{
char pSourceStr[]={"abcdefghijk"};
cout<<"The source string: \t"<<pSourceStr<<endl;
//新建一个指向ReverseString()函数中申请到的内存的指针
char* pDescStr=ReverseString(pSourceStr,strlen(pSourceStr));
cout<<"The desc string: \t"<<pDescStr<<endl;
//在这里释放ReverseString()函数中申请到的内存
delete[] pDescStr;
//清除pDescStr指针,以免在今后的使用中出现溢出
pDescStr=NULL;
}

从上面的例子可以看出,new和delete并没有在同一个函数中出现,但是很明显这样做没有造成内存泄露(memory leak)。

或许这样使用new和delete有点小儿科,达到ReverseString()函数的目的完全可以不必使用new和delete。我认为new和delete最大的用武之地是在线程通信和进程通信中:比如线程A要向线程B投递一条信息,并要求不等线程B做出反应线程A就要马上进行后面的操作,也就是要求使用PostMessage(...)函数来投递消息,而且发送的消息内容存储在一个50K或者更大的内存空间中,那就必须使用new和delete了,也就是在线程A中用new准备好这样一个庞大的消息,之后把指针发送给进程B,进程B在处理完消息之后用delete释放这块内存。

总而言之,new和delete并非我们想像的那么简单,除了我所提到的用处之外还有不少其他的用处,有待研究。

转载于:https://www.cnblogs.com/yulang314/p/3558428.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值