👻 概念
程序中的内存分为两个部分:
- **栈:**在函数内部声明的所有变量都将占用栈内存
- **堆:**程序运行时用于动态分配内存
👻 运算符
-
new
运算符 —— 动态分配内存new data-type;
-
delete
运算符 —— 释放内存delete pvalue; // 释放 pvalue 所指向的内存
👻 变量 内存管理
👾单个变量
- 分配内存
int* pvalue = NULL; // 初始化 null 指针
pvalue = new int; // 请求内存
int* pvalue = NULL; // 初始化 null 指针
if(!(pvalue = new int)) { // 请求内存
cout << "Error: out of memory." <<endl;
exit(1);
}
- 赋值
*pvalue = 10; // 在分配的地址存储值
cout << "Value of pvalue : " << *pvalue << endl;
- 释放内存
delete pvalue; // 释放内存
👾一维数组
- 分配内存
// 分配内存 数组长度为 m
int* array = new int[m];
- 释放内存
// 释放内存
delete[] array;
👾二维数组
- 分配内存
// 分配内存,数组第一维为 m,第二维为 n
int** array = new int* [m];
for(int i=0; i<m; i++) {
array[i] = new int [n];
}
- 释放内存
// 释放内存
for(int i=0; i<m; i++) {
delete[] array[i];
}
delete[] array;
👾三维数组
- 分配内存
// 分配内存,第一维为 m, 第二维为 n, 第三维为h
int*** array = new int** [m];
for(int i=0; i<m; i++) {
array[i] = new int* [n];
for(int j=0; j<n; j++) {
array[i][j] = new int [h];
}
}
- 释放内存
// 释放内存
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
delete[] array[i][j];
}
delete[] array[i];
}
delete[] array;
👻 对象 内存管理
// 类Box定义如下:
class Box {
public:
Box() { cout << "调用构造函数" <<endl; }
~Box() { cout << "调用析构函数" <<endl; }
void display() { cout << "调用display函数" << endl; }
};
👾单个对象
// 分配内存
Box* box = new Box();
// 使用
box->display();
// 释放内存
delete box;
调用构造函数
调用析构函数
👾对象数组
// 分配内存
Box* boxs = new Box[4];
// 释放内存
delete[] boxs;
调用构造函数
调用构造函数
调用构造函数
调用构造函数
调用析构函数
调用析构函数
调用析构函数
调用析构函数
👻 对比
分配内存 | 使用 | 释放内存 | |
---|---|---|---|
单个变量 | int* pvalue = NULL; pvalue = new int; | *pvalue = 10; | delete pvalue; |
一维数组 | int* array = new int[m]; | delete[] array; | |
单个对象 | Box* box = new Box(); | box->display(); | delete box; |
对象数组 | Box* boxs = new Box[4]; | delete[] boxs; |