基本定义
new和malloc都是在堆上进行的内存分配,也称动态内存分配;
程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
new/delete
new和delete运算符用于动态内存分配和撤销内存;
1.单变量内存分配
int *a = new int;//将一个int类型的地址赋值给整型指针a
delete a;// 释放单个 int 的空间
int *a = new int (5);//作用同上,同时赋初值为5
delete a;
2.开辟数组空间
int *a = new int [100]; 开辟一个大小为 100 的整型数组空间
delete [] a; //释放int数组空间
new/delete是C++运算符;
new 返回指定类型的指针,
以具体类型为单位进行内存分配;
new可以初始化;
malloc/free
分配长度为 num_bytes 字节的内存块 ,分配成功则返回指向被分配内存的指针,否则返回空指针 NULL。
int* p = (int *) malloc (5*sizeof(int));//定义5个int型的内存空间,并强制返回int指针类型
free(p);//释放指针p
malloc/free 是 C++/C 语言的标准库函数;
malloc以字节为单位内存分配,需计算,如5*sizeof(int);
malloc默认返回voild*,返回时需强行转换为实际类型的指针;
不具备初始化特性;
常见内存错误
1.内存分配未成功
使用内存之前检查指针是否是null, 如if (p==NULL) 或 if (p!=NULL) ;
2.内存分配成功,但尚未初始化就使用
记得赋初值(内存的缺省初值究竟是什么并没有统一的标准);
3.内存分配成功并且已经初始化,但操作越过了内存的边界
例如在使用数组时经常发生下标 “多 1” 或者 “少 1” 。特别是在 for 循环语句中,循环次数很容易搞错,导致数组操作越界。
4..忘记释放内存,造成内存泄露
动态内存的申请与释放必须配对;
5.释放内存还继续使用它
用 free 或 delete 释放了内存之后,立即将指针设置为 NULL,防止产生 “野指针”。
参考