读《高质量的C/C++编程》(二)——内存管理

没学过C++,所以,主要看了与C相关的,获益匪浅

总结一下,主要几点是:

1、对于三种内存分配方式需要加强了解,各有所长。

2、动态申请与释放一定要配对。

3、一定要注意野地址的处理。

《高质量的C/C++编程》下载地址

下面是一些详细的笔记:

第七章 内存管理

7.1 内存分配方式

这一块儿自己原本有些许了解,但一直不重视,现在看来,原来自己太幼稚了。

1、 静态存储区域分配。编译时分配,程序整个运行期间都存在,如全局变量和static变量
2、 栈上创建。函数执行时,函数内部变量创建,效率高,但分配的内存容量有限。
3、 堆上分配,即动态内存分配。用malloc和new申请任意内存,用free和delete释放内存,生存期由自己决定,灵活方便,但问题也最多。
7.2 常见的内存错误及其对策
发生内存错误最麻烦的莫过于需要到运行时才能捕捉到……
1、 内存分配未成功,却使用了它(自己偶尔会不对分配成功与否进行检查)
解决方案: 在使用前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。
2、 内存分配成功,但未初始化就引用它
内存的缺省值没有统一标准,所以,一定要初始化。
3、 内存分配成功且已经初始化,但操作越过了内存的边界
4、 忘记释放内存,造成内存泄露。(这是自己经常犯的错,mark一下)
动态申请与释放必须配对。
5、 释放了内存却继续使用
1、程序太过混乱造成。重新设计数据结构吧,亲
2、return语句写错了。不能返回“栈内存”的指针或引用,会被自动释放掉的
3、free或delete后,需要将指针设置为NULL,防止产生“野地址”。

注意:
1、用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。
2、不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
3、避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。
4、动态内存的申请与释放必须配对,防止内存泄漏。
5、用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。
7.3 指针与数组的对比
1、数组在静态存储区或栈上创建,对应着一块内存,地址与容量保持不变。
2、指针可以指向任意内存块,是“可变”的,灵活但危险。
3、内容:
1、char a[] = "hello";  //a是一个字符串变量,内容为hello\0,可以修改;
2、char *p = "hello";   //p指向的是一个常量字符串,不能修改。
4、数组与指针的复制、赋值不同。
5、计算内存容量。
1、用sizeof可以计算出字符串长度。不能得出指针所指内容的长度,只能在申请的时候知道其长度。
2、对字符数组,sizeof与strlen不同,要注意。
6、若函数参数是一个指针,不能用这个指针去申请动态内存。
*、因为编译器会给每个参数制作临时副本,修改的事参数的临时副本的值。
*、若必须用指针去申请内存,参数应该用指针的指针。
*、用函数返回值来传递动态内存。但切记不能返回指向“栈内存”的指针。
自己实验发现str = GetString语句后,str的内容跟GetString里赋值一样……
7、free和delete把指针怎么了?
free和delete只是把指向的内存给释放掉,本身地址仍存在,指针成为“野指针”,必须对其进行处理,p = NULL。
8、动态内存会被自动释放吗?
指针消亡了,指向的内存并不一定会被自动释放。
内存释放了,并不表示指针会消亡或成为NULL指针。
9、杜绝“野指针”。
产生: 1.指针变量未初始化。
2.指针被free或delete后没设置为NULL。
3.指针操作超过了变量的作用范围。
10、malloc/free与new/delete
11、内存耗尽怎么办?  此时分配内存会失败,返回NULL指针。
解决方案: 1.判断是否为NULL,用return结束函数。
2.判断是否为NULL,用exit(1)结束整个程序的运行。
3.为new和malloc编写异常处理函数。
对32位以上的应用程序,不可能导致“内存耗尽”,因为支持虚存。
12、malloc/free的使用要点。
void * malloc (size_t size);
1.malloc返回值是void *,所以,调用时必须显示地进行类型转换,转换为所需的指针类型。
2.不同数据类型在不同系统下所占空间大小不一样,所以,在malloc中要善于用sizeof。
void free(void * memblock);
1.若P不是NULL型变量,连续进行两次及以上就会造成运行错误。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值