高质量C++/C编程指南 -- 第7章 内存管理 P3

关于《高质量C++/C编程指南》 这本书是林锐博士写于2001年7月,现在都2012年了,相隔10年多, 用了两天时间看完这个100页的书,里面几乎没有废话,全是精炼的总结性的东西, 思路顺畅,语言流畅,看起来不费劲。 一共11章,其中1-6章的内容,和我自己的习惯是一致的,看此书之前已经是我的习惯了, 看了之后更加印证了正确性。 第7章,内存管理,我认为这一章是正本书中最精华的部分,是给我帮助最大的一部分。 8-11章对我的启发介于前两者之间。 以下是我觉得比较重要,或者说容易忘记的几条(因为可能不常用),列出来以备以后查阅, 阅读详情

 http://www.bccn.net/Article/kfyy/cjj/jc/200512/2634_3.html

 

 

7.3.3 计算内存容量

用运算符sizeof可以计算出数组的容量(字节数)。示例7-3-3(a)中,sizeof(a)的值是12(注意别忘了’\0’)。指针p指向a,但是sizeof(p)的值却是4。这是因为sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量。C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。

注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。示例7-3-3(b)中,不论数组a的容量是多少,sizeof(a)始终等于sizeof(char *)。

char a[] = "hello world";

char *p = a;

cout<< sizeof(a) << endl; // 12字节

cout<< sizeof(p) << endl; // 4字节

示例7-3-3(a) 计算数组和指针的内存容量

void Func(char a[100])

{

cout<< sizeof(a) << endl; // 4字节而不是100字节

}

示例7-3-3(b) 数组退化为指针

7.4指针参数是如何传递内存的?
如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么?

void GetMemory(char *p, int num)

{

p = (char *)malloc(sizeof(char) * num);

}

void Test(void)

{

char *str = NULL;

GetMemory(str, 100); // str 仍然为 NULL

strcpy(str, "hello"); // 运行错误

}

示例7-4-1 试图用指针参数申请动态内存

毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。

如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,见示例7-4-2。

void GetMemory2(char **p, int num)

{

*p = (char *)malloc(sizeof(char) * num);

}

void Test2(void)

{

char *str = NULL;

GetMemory2(&str, 100); // 注意参数是 &str,而不是str

strcpy(str, "hello");

cout<< str << endl;

free(str);

}

示例7-4-2用指向指针的指针申请动态内存

由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。这种方法更加简单,见示例7-4-3。

char *GetMemory3(int num)

{

char *p = (char *)malloc(sizeof(char) * num);

return p;

}

void Test3(void)

{

char *str = NULL;

str = GetMemory3(100);

strcpy(str, "hello");

cout<< str << endl;

free(str);

}

示例7-4-3 用函数返回值来传递动态内存

用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把return语句用错了。这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡,见示例7-4-4。

char *GetString(void)

{

char p[] = "hello world";

return p; // 编译器将提出警告

}

void Test4(void)

{

char *str = NULL;

str = GetString(); // str 的内容是垃圾

cout<< str << endl;

}

示例7-4-4 return语句返回指向“栈内存”的指针

用调试器逐步跟踪Test4,发现执行str = GetString语句后str不再是NULL指针,但是str的内容不是“hello world”而是垃圾。

如果把示例7-4-4改写成示例7-4-5,会怎么样?

char *GetString2(void)

{

char *p = "hello world";

return p;

}

void Test5(void)

{

char *str = NULL;

str = GetString2();

cout<< str << endl;

}

示例7-4-5 return语句返回常量字符串

函数Test5运行虽然不会出错,但是函数GetString2的设计概念却是错误的。因为GetString2内的“hello world”是常量字符串,位于静态存储区,它在程序生命期内恒定不变。无论什么时候调用GetString2,它返回的始终是同一个“只读”的内存块。

 

高质量C++/C编程指南(附录C :C++/C试题的答案与评分标准)   附录C :C++/C试题的答案与评分标准 一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分)   请写出 BOOL  flag 与“零值”比较的 if 语句。(3分) 标准答案:     if ( flag )     if ( !flag ) 如下写法均属不良风格,不得分。     if (flag == TRUE)       if ( 阅读详情

相关推荐

C++/C编程高质量实践指南

本文还有配套的精品资源,点击获取 简介:在C++和C编程中,遵循高质量编程实践对于代码的可读性、可维护性和性能至关重要。本指南涵盖编程基础、面向对象编程、设计原则、错误处理、性能优化、编码规范、测试、版本控制、代码审查和文档编写等多个方面。实践这些原则将有助于编写出健壮可靠的高质量程序。 1. 深入理解C++/C内存管理 1.1 内存管理基础 内存管理...

weixin_42360733的博客 1155

读书笔记-高质量C++/C编程指南-第7章 内存管理

  【序】最近痛下决心要好好学习下C和C++,以为即将来临的求职做点准备,在网上搜野指针的问题时看到了《高质量C++/C编程指南》,对于我这种想从事嵌入式开发的人来说,犹如收获到一本编程的bible似的。此文对C和C++编程的风格及注意事项进行了精妙的分析,集合了Thinking in C++、Effective C++等经典书籍的主要内容,实乃至宝啊本人对此文进行了研读,红色部分是我

Sailor_forever 1580

工程制图习题集张大庆课后习题答案解析

所以,我想向大家求助,希望能得到一些学习资料、学习方法和学习经验,帮助我更好地理解和掌握这门课程。在寻找学习资料的过程中,我发现了一款叫做资小料的APP,它里面有很多关于工程制图的学习资料,包括视频教程、习题解答和考试真题等。通过使用资小料,我逐渐掌握了工程制图的基本理论和方法,解决了很多学习中遇到的问题。在这里,我想推荐给和我一样在学习《工程制图习题集》这门课的同学们,希望大家也能从这款APP中受益,共同进步。上传者: 『Consentesdei』蒼迷穀。出版社: 清华大学出版社。

weixin_58833001的博客 925

高质量C++/C编程指南 -- 第7章 内存管理 (1)

高质量C++/C编程指南 -- 第7章 内存管理 (1)程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本章的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。7.1内存分配方式内存分配方式有三种:(1)       从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内

tattarrattat的专栏 1068

东方马达步进电机AZM66AK-HS100+AZD-KD调试经验记录

东方马达步进电机AZM66AK-HS100+AZD-KD调试经验记录(20170803YC) 本次总结主要实现的功能如下:用MEXE02软件在步进电机驱动器中设置好控制动作,每个控制动作有一个特定的编号。之后通过PC和驱动器之间的485通讯,发送相关指令,使步进电机按照一定编号的控制动作运转。 参考资料:东方马达步进电机AZM66AK-HS100+AZD-KD的产品手册,可在官网下载。 A....

dahailuoa6的博客 1万+

Stata实战:DID平行趋势检验完整操作指南(附reghdfe+coefplot代码)

本文提供了一份使用Stata进行DID平行趋势检验的完整实战指南。文章详细讲解了从数据准备、生成相对时间变量,到利用reghdfe命令构建动态效应模型,以及使用coefplot命令进行结果可视化的全流程操作。核心在于通过检验政策前交互项的显著性,验证处理组与对照组是否满足平行趋势假设,为后续因果推断奠定可靠基础。

weixin_29231725的博客 1380

读完林锐《高质量C++/C 编程指南》后的几点想法

由于在工作中内存的处理操作上显示出了明显不足,又重新仔细的看了一遍林锐的《高质量C++/C 编程指南》,重新的理解代码规范和内存指针问题。   1.代码规划中,空格和部分注释的命名规则,自己工作中空格未有效使用,注释的命名规则没有达到看到即知其意思的水平。需要改进。   2.对于内存的操作,理解不足,聪明的程序员能够很好的理解内存在哪,指针位置到哪,我工作中不能很好的理解内存指针,访问越界导致

尤加辉的专栏 1247

酒店前台pms管理系统

对于酒店经营者来说,选择一款优秀的管理系统,是提升运营效率、优化客人体验的关键。PMS酒店管理系统凭借其强大的房态管理、实时数据监控、OTA直联、无人值守等功能,已经成为许多酒店提升管理水平的得力助手。无论是大中型酒店,还是小型民宿,PMS系统都能根据不同需求提供量身定制的解决方案,帮助酒店实现精细化管理、提高运营效率。如果你也在为酒店管理中的繁琐琐事而困扰,不妨尝试一下PMS酒店管理系统,感受科技带来的便利与高效,让你的酒店运营更上一层楼!

2409_89897808的博客 2484

高质量C++/C编程指南

      高质量C++/C编程指南    文件状态[  ] 草稿文件[√] 正式文件[  ] 更改正式文件文件标识: 当前版本:1.0作    者:林锐 博士完成日期:2001年7月24日  版 本 历 史 版本/状态作者参与者起止日期备注V 0.9草稿文件林锐  2001-7-1至2001-7-18林锐起草V 1.0正式文件林锐  2001-7-18至2001-7-24朱洪海审查V 0.9,林

网络空间安全与企业信息化 2095

全志V3S嵌入式驱动开发(解决kernel 5.2.y wifi驱动问题)

​【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 wifi模块,之前测试的时候,开发板上用的是esp8089,当时内核时4.14.y,测试也是通过的。链接地址在这里, https://blog.youkuaiyun.com/feixiaoxing/article/details/131178420?spm=1001.2014.3001.5501 那个时候测试的时候,我们就说过,wifi驱动可能是除了镜像制作之外,最复杂的一个

嵌入式-老费,一个分享专业嵌入式知识的blog 1158

128、点云配准与ICP:经典配准算法与深度学习配准

上周调试一台双臂协作机器人,左手持结构光相机扫描桌面上的随机堆叠工件,右手准备执行抓取。问题出在“对齐”这一步——相机扫描得到的点云和CAD模型点云之间差了大约15度的旋转,导致抓取姿态计算出来直接怼到桌面上。我第一反应是“ICP跑一下不就行了”,结果跑了三分钟,误差纹丝不动,甚至越迭代越发散。后来查了日志才发现,初始位姿给得太离谱,ICP直接掉进了局部最优。这个场景太典型了——很多人以为点云配准就是调个ICP库函数,实际工程里坑比想象中多得多。今天这篇笔记,咱们把点云配准这件事从头捋一遍。

sundong_81的博客 42

C++内存管理 && 读高质量C++/C编程指南第7章

C++中的内存管理是很值得学习一下,非常容易出错

weixin_43164548的博客 1814

点云焊缝提取

本文介绍了一个基于PCL库的点云处理流程,包含三个核心模块:MLS平滑处理通过多项式拟合修正点云位置;差异提取通过双向匹配定位源/目标点云的非重叠区域;统计过滤剔除离群噪声点。该流程采用"平滑-筛选-净化"的通用思路,将复杂算法封装为可配置接口,实现了工业级点云预处理。文章重点分析了各模块的原理、PCL接口调用及参数设计逻辑,同时指出参数调优、算法扩展等深入探索方向,展现了PCL在点云处理中的模块化优势与实用价值。

weixin_45196569的博客 250

高质量C++/C编程指南 -- 第7章 内存管理 (2)

高质量C++/C编程指南 -- 第7章 内存管理 (2)7.7 杜绝“野指针”“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。“野指针”的成因主要有两种:(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气

tattarrattat的专栏 964

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

林锐C++/C高质量编程附录答案(-)

附录C :C++/C 试题的答案与评分标准一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10 分)请写出 BOOL flag 与“零值”比较的 if 语句。(3 分)标准答案:if ( flag )if ( !flag )如下写法均属不良风格,不得分。if (flag == TRUE)if (flag == 1 )if (flag == FALSE)if (fla

wss71104307的专栏 1500

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

《高质量程序设计指南:C++/C语言》面试题整理

本试题仅用于考查C++/C程序员的基本编程技能。内容限于C++/C常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。 笔试时间90分钟。请考生认真答题,切勿轻视。 从《高质量程序设计指南:C++/C语言》摘录,若想晓得答案,自己运行一遍即可。欢迎交流。 PS:如果想看数据结构和常用算法,可以参考我的Google Code项目ADT-in-C项目。 一、以下为Windows

fovwin的专栏 4174

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

高质量C++/C编程指南 -- 第7章 内存管理

第7章 内存管理欢迎进入内存这片雷区。伟大的Bill Gates 曾经失言: 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办

gzblog的专栏 617

高质量C++/C编程指南(七)内存管理

一、内存的分配方式 二、常见的内存错误及其对策 三、指针参数是如何传递内存的? 1、如果非得要用指针参数去申请内存,那么应该用“指向指针的指针”。 2、用函数返回值来传递动态内存 四、free和delete把指针怎么啦? 五、动态内存会被自动释放吗? 六、杜绝“野指针' 七、内存耗尽怎么办? 八、malloc/free的使用要点 1、malloc 2、free 九、new/delete的使用要点 1、new 2、delete 十、一些心得体会

Exp.Joker 750

高质量c++/c编程指南—内存管理篇

以下是阿鲤对高质量c++/c编程指南的读书笔记及自己的理解,分享出来希望对大家有用。这里是第七章的内容: 1:内存的分配方式。 2:常见的内存错误及其对策。 3:指针与数组的对比。 4:指针参数是如何传递内存的? 5:free和delete把指针怎么啦? 6:动态内存会自带释放吗? 7:杜绝“野指针” 8:有了malloc/free为什么还要new/delete 9:内存耗尽怎么...

belongHWL的博客 332

高质量C++/C编程指南 -- 第7章 内存管理 P2

http://www.bccn.net/Article/kfyy/cjj/jc/200512/2634_2.html   7.3.1 修改内容 示例7-3-1中,字符数组a的容量是6个字符,其内容为hello\0。a的内容可以改变,如a[0]= ‘X’。指针p指向常量字符串“world”(位于静态存储区,内容为world\0),常量字符串的内容是不可以被修改的。从语法上看,编译器并不觉得语句

-----------------------------不要在跟自己无关的事情上浪费时间 811

高质量程序设计指南C++/C试题

附录A C++/C试题一、请计算sizeof表达式和strlen表达式的值。(10分)二、请填写bool、float、指针变量与“零值”比较的if语句。(10分)三、简答题。(20分)四、有关内存的思考题。(20分)五、类型转换。(5分)六、编写strcpy函数。(10分)七、编写类String的普通与拷贝构造函数、析构函数以及赋值函数。(25分) 假设本试题均为Windows NT下的32位C++ 程序。本试题仅用于考查C++/C程序员的基本编程技能,不涉及数据结构、算法,以及深奥的语法。考试成绩能反映出

weixin_59803490的博客 476

高质量C++/C编程指南 -- 第7章 内存管理 P5

http://www.bccn.net/Article/kfyy/cjj/jc/200512/2634_5.html   7.9 内存耗尽怎么办? 如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。通常有三种方式处理“内存耗尽”问题。 (1)判断指针是否为NULL,如果是则马上用return语句终止本函数。例如: void Func(vo

-----------------------------不要在跟自己无关的事情上浪费时间 1168

林锐《高质量C++/C 编程指南》附录之《C++/C 编程质量试题》

C++/C 试题本试题仅用于考查C++/C 程序员的基本编程技能。内容限于C++/C 常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。笔试时间90 分钟。请考生认真答题,切勿轻视。一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10 分)提示:这里“零值”可以是0, 0.

ShorminHsu的专栏 1724
上一篇: 高质量C++/C编程指南 -- 第7章 内存管理 P2
下一篇: 高质量C++/C编程指南 -- 第7章 内存管理 P5
sergery
博客等级 码龄18年 113粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值