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

C++ new delete(二)相关推荐

  1. django模型——数据库(二)

    模型--数据库(二) 实验简介 模型的一些基本操作,save方法用于把对象写入到数据库,objects是模型的管理器,可以使用它的delete.filter.all.order_by和update等函 ...

  2. 用new创建一个二维数组,有两种方法,是等价的

    //用new创建一个二维数组,有两种方法,是等价的      一:      int   (*p)[10]   =   new   int[5][10];      二:      int   **p ...

  3. MySQL数据库中的删除命令:delete、truncate、drop

    MySQL删除数据的方式都有哪些? 咱们常用的三种删除方式:通过 delete.truncate.drop 关键字进行删除:这三种都可以用来删除数据,但场景不同. 一.从执行速度上来说 drop &g ...

  4. delete、truncate、drop的区别有哪些,该如何选择

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里 上周同事小姐姐问我:"哈哥你看,我发现MySQL有bug,我下午为了清理磁盘,明明删除了100万条MySQ ...

  5. MySQL数据库程序设计(二)

    MySQL数据库程序设计(二) 前言 MySQL编程语言 结构化查询语言SQL MySQL语言组成 数据库定义语言(DDL) 数据操纵语言(DML) 数据控制语言(DCL) MySQL扩展增加的语言要 ...

  6. 数据结构:二叉搜索树的增删查改

    二叉搜索树的增删查改 二叉搜索树(Binary Search Tree) 基本操作之查找(Update) 基本操作之修改(Update) 基本操作之增加(Create) 基本操作之删除(Delete) ...

  7. Django内置Admin

    Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP:django.contrib.authdjango.contrib.contenttypes ...

  8. Java基础篇:IO流

    文章目录 一.File类的使用 File类的概述 File类的实例化 File类的常用方法 二.IO流原理及流的分类 Java IO原理 流的分类 流的体系结构 输入.输出的标准化过程 三.节点流(文 ...

  9. MySQL数据库触发器(trigger)

    MySQL触发器(trigger):监视某种情况并触发某种操作 一:四要素 触发时间:before/after 地点:table 监视操作:insert/update/delete 触发操作:inse ...

最新文章

  1. iOS15.4 来袭:新增“男妈妈”表情及口罩面容解锁、AirTags 反跟踪等新功能
  2. python月薪是多少-2019年 Python就业市场行情好不好, 薪资多少?
  3. Spring Cloud Alibaba - 20 Nacos StandAlone模式下的数据存储(Derby)及新增登录用户
  4. libsvm matlab 调参数,matlab – 使用libsvm调整svm
  5. ocx可以被Java调用么_java调用ocx
  6. Java nextInt()函数
  7. 服务器装系统蓝屏怎么办,重装系统蓝屏怎么办
  8. radius服务器认证系统,TekRadius(RADIUS服务器)
  9. Spark SVN + Eclipse 3.3 + Subversive Installation Guide
  10. 回调函数Callback
  11. IB学生可以报考全球顶尖大学,需要多少分?
  12. 【一文读懂】python 中的 numpy.reshape(a, newshape, order=‘C‘) 详细说明及实例讲解
  13. unity overrideSprite的使用
  14. The word ‘xx‘ is not correctly spelled问题的解决
  15. 计算机网络英语作文150字,微信投票的英语,写一篇关于网络投票看法的英语作文150字左右...
  16. html onload div,将备用页面内容加载到div onload中
  17. 基于屏幕空间渲染的液体模拟
  18. Python -- Matplotlib:设置画布大小和子图个数
  19. select下拉选项禁用
  20. hdu4121 象棋checkmate模拟

热门文章

  1. C语言创建map,遍历map
  2. VTK:可视化算法之CarotidFlow
  3. OpenGL灰色滤镜
  4. C++Persistent segment tree持久段树的实现算法(附完整源码)
  5. C语言实现List实现(附完整源码)
  6. QT绘制变焦线(Zoom Line)
  7. QT的QDesignerFormWindowInterface类的使用
  8. 经典C语言程序100例之十三
  9. 线程池什么时候调用shutdown方法_ThreadPoolExecutor.shutdown()?
  10. 「Apollo」直接在docker内部安装miniconda失败