一. 概念:
1. 静态分配:
编译器在处理程序源代码时分配.
2. 动态分配:
程序执行时按动态要求分配.
※ (1). 静态分配效率高, 动态分配灵活性高.
(2). 静态对象都是有名字的变量, 我们直接对其操作, 而动态对象是没有名字的变量, 我们是用指针间接地对它进行操作.
(3). 静态对象的分配与释放由编译器进行处理, 动态对象必须由程序员显式的管理, 相对来说较易出错.
二. 分配动态内存函数:
1. C: 头文件: <stdlib.h> C++:无须头文件
释放: free() 释放: delete 分配: malloc() 分配: new
能直接释放, 如:free(p); 三种用法对应的释放方式: (1). int* p = new int ; 对应=> delete p ;
(2).int* p = new int[5]; 对应=> delete []p ; // ([]内不用填)
(3).int* p = new int(5); 对应=> delter p ;
定义: int*p = (int*)malloc( sizeof(int) ) ; 定义: int* p = new int ;
int* p = (int*)malloc( sizeof(int)*100 ) ; int* p =new int[100] ;
初始化: 无法初始化. 初始化: int* p = new int(100); ==>两串: int* p = new; p = 100 ;
使用: 不需调任何函数. 使用: new需要调用构造函数, delete需调用析构.
(1). malloc():
函数原形: void* malloc( unsigned int size );
说明: ①. size这个参数的含义是分配的内存的大小(以字节为单位).
②. 返回值: 失败, 则返回值是NULL(空指针).成功, 则返回值是一个指向空类型(
成功, 则返回值是一个指向空类型(void)的指针, 即所分配内存块的首地址.
(2). free():在分配了动态内存以后, 如果不释放(free), 就会引起内存泄露.三. 野指针:
1. 定义: 不是”NULL”指针, 是指向”垃圾”或不确定位置的内存的指针.
2. 有三种情况会出现野指针:
(1). 指针变量没有被初始化.
(2). 指针p被free或delete之后, 没有置为NULL, 让人误以为p是个合法的指针. (3). 指针操作超越了变量的作用范围(不易发现).
四. 内存泄露(memory leak):
指一块动态分配的内存, 我们不再拥有指向这块内存的指针, 因此我们没有办法将它返回给程序供以后重新使用.
char * p=(char *)malloc(sizeof(char )*100); // ① // 还未释放.
p = ”123”; // ② 内存泄露
puts(p);
free(p); // 崩溃(free只能释放堆区的数据, 不能释放数据区的数据).
注意: 1. 如果函数行参是一个指针, 不要指望用该指针去申请动态内存.
2. 指针消亡了, 并不代表它指的内存会被自动释放, 内存被释放了, 并不表示指针会消亡或者成了空指针.
3. 在使用malloc后, 必须要free.