内存
内存分配的方式有几种?
- 静态存储区分配
- 栈上分配
- 堆上分配
栈与堆的概念及区别
概念: 堆栈:特殊的存储区,主要功能是暂时存放数据和地址。 区别:
- 申请方式。栈的空间由操作系统自动分配/释放。堆的空间由程序员手动去分配/释放。
- 申请大小的限制。栈一般是一块连续的存储区域,内存大小为2M。堆是不连续的内存区域,其大小受限于计算机系统有效的虚拟内存。
- 申请效率。栈由系统自动分配,速度很快。堆是由new分配的内存,一般速度比较慢,不过用起来方便。
栈在C语言中有什么作用?
- 用来存储临时变量,临时变量包括:函数参数和函数内部定义的临时变量。
- 栈是多线程编程的基石。
C语言中函数参数压栈的顺序是怎样的?
从右往左。主要是为了支持可变长参数形式。
什么是内存泄漏?
申请了一块内存空间,使用完毕后没有释放掉。
如何判断内存泄露?
- 良好的编码习惯,尽量在涉及内存的程序段,检测出内存泄露。
- 将分配的指针以链表的形式自行管理,使用完毕后从链表删除。
- Boost 中的smart pointer。
- 一些常见的插件工具:Leaky,ccmalloc,Dmalloc。
new/delete与malloc/free的区别是什么?
-
new/delete是C++中的操作符,malloc/free是标准库函数。
-
malloc/free不能自动的调用构造函数和构析函数,而new/delete可以。
-
new返回的是指定类型的指针,可自动计算所申请内存的大小,而malloc需要我们自己计算申请内存的大小,并在返回时,强行转换为实际类型的指针。
指针
数组指针和指针数组的区别?
*数组指针就是指向数组的指针,它实际上是一个指针。如:int (p)[8]。 *指针数组就是数组中的元素是指针,它实际是一个数组。如:int p[8]。
函数指针和指针函数的区别?
1.函数指针: 在程序中定义了一个函数,那么在编译时系统会自动为这个函数分配一段存储空间,这段存储空间的首地址称为这个函数的地址。函数名表示这个地址。在地址中,我们可以定义一个指针变量来存放,这个指针变量就叫做函数指针变量,简称函数指针。
一般形式:类型名 (*指针名)(指针参数列表) int *p(int int ) :一个指向函数的指针变量p
2.指针函数: 是一个函数,其返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,指针函数一定有“函数返回值”,在主调函数中,函数返回值必须赋给同类型的指针变量。
一般形式:类型名 *函数名(函数参数列表) int *p(int ,int) p是一个函数,前面有int,也就是说p是一个返回值为整形指针的函数。
数组名和指针的区别与联系
- 数据保存方面。指针保存的是地址。数组保存的是数据。
- 数据访问方面。指针对数据是间接访问,需要用到解引用符号(*数组名)
数组对数据是直接访问,可通过下标访问或数组名+元素偏移量的方式。 - 使用环境。指针多用于动态数据结构和动态内存开辟。
数组用于存储固定类型个数且类型统一的数据结构和隐式分配。
指针常量,常量指针,指向常量的常量指针有什么区别?
1.指针常量 int * const p p是一个常量类型的指针,不能修改这个指针的指向,但这个指针所指向的地址上存储的值可以修改。 2.常量指针 int const *p 定义一个指针指向一个常量,不能通过指针来修改这个指针指向的值。 3.指向常量的常量指针 const int *const p 既不能修改指针的值,也不能修改指针指向的值。
野指针是什么?
- 指向不可用内存的指针,当指针被创建时,指针不可能自动指向NULL。
- 当指针被free/delete释放掉时,没有把指针置为NULL。
- 指针操作超越了变量的作用范围。
如何避免野指针
- 对指针进行初始化。
- 指针用完后释放内存,将指针赋NULL。
大小端问题
大端:高位字节排放在内存的低地址端,低字节位排放在内存的高地址端。 小端:低位字节排放在内存的低地址端,高字节位排放在内存的高地址端。 简单来说:大端——高尾端,小端——低尾端
|