个人日志

物联网 & 极简主义

〈26,读书笔记——林锐·高质量C编程指南:卷7——内存管理〉

在本篇我们涉及内存分配,常见内存错误,指针和数组的比较,指针参数是如何传递内存的,free和delete把指针怎么了,动态内存可以自动释放么,杜绝野指针,有了malloc和free,为什么还需要new和delete。内存耗尽怎么办,malloc.和free的使用要点,new和delete的使用要点,

——————————————————————————

1,内存分配

1.1 静态存储区分配,编译时,如全局,static。

1.2 栈,运行时动态分配局部函数,运行完立即释放。

1.3 堆,动态内存分配,自行new,malloc分配,delete,free释放。


——————————————————————————

2,常见内存错误及对策

2.1 并未分配成功却使用

我们总是想当然认为成功了,实则不然。

对策:使用前先进行NULL判定。


2.2 虽分配成功但未初始化,即使用

我们经常默认系统初始化了,实则没有。

无论何种方式来创建数组或指针,都要初始化或赋零值。


2.3 内存分配成功,且已初始化,但使用时越过边界

如数组的下标超1,for循环体次数超


2.4 忘记释放内存,导致内存泄露

malloc和free成对。new和delete成对

2.5 释放了内存却继续使用它

如,free和delete后忘了置NULL。

再如,return 不对的变量

————————————————————————

3,数组和指针的区别

3.1 数组对应着一片内存,是固定的,只是内存上的内容可以改变

3..2 而指针可以指向任何一块内存,一般可以随意改变指向。

3.3 数组间相互操作,用strcpy, strcmp.。

3.4 sizeof数组可以得到大小,而sizeof指针=4

3.5 在3.4中,若数组作为函数参数传递,则自动转换为指针,大小为4

————————————————————————————

4,指针参数是如何传递内存的

4.1 如果函数参数是一个指针,则不要指望用这个指针来申请内存,并且还会产生内存泄露,因为不能及时free。

若非要这样做,则用指向指针的指针。

然而最好的方法是通过返回值来获得指针。

但且忌返回栈指针。

—————————————————————————

5,free和delete把指针怎么了

5.1 free和delete只是将指针指向的东西释放掉,而指针本身没删除,而是成为野指针了

且记要置NULL

—————————————————————————

6,动态内存会自动释放么

不,

通常,指针指向的内存释放不代表指针消失,

指针消失也不代表指向的内存释放。

一定要慎重

————————————————————————

7,如何杜绝野指针

野指针,非NULL指针,而是随便指的指针。

7.1 一般指没有赋初值的指针。

7.2 和free 或delete后,没有置NULL的指针

7.3 指针操作超越了变量的作用范围。

————————————————————————

8,有了malloc和free,为什么还要new和delete

malloc 和 free是标准库函数,而new和delet是C++运算符。

故,不能把对象创建和消亡前的构造析构任务强加给malloc和free

总言之,new和delete自动附加了初始化和清除工作,而不仅仅是对内存操作

——————————————————————————

9,内存耗尽怎么办

若耗尽,则返回NULL指针。

9.1 若指针为NULL,马上用return来终止该函数

9.2 若指针为NULL,马上用exit(1)来终止整个程序的运行

——————————————————————————

10,malloc,free的使用要点

10.1 申请一块长度为length的整数类型的内存

int *p = (int *)malloc (sizeof(int) * length)

类型转换 && sizeof

10.2 malloc的原型返回值是void *的,故要类型转换。

10.3 sizeof里面的参数长度必须已知。

10.4 free不能对同一个指针连续两次操作,即,不能free了再free。

————————————————————————

11,new和delete的使用要点

11.1 若使用new来创建对象数组,则只能使用无参构造器。

11.2 用delete释放时,留意不要丢了[]

如,delete []obj;

————————————————————————

此日志仅为笔记,若需电子版,请留言

上一篇 下一篇
评论
©个人日志 | Powered by LOFTER