C++ 动态内存
C++ 动态内存
C++程序中,内存分为:
- 栈:在函数内部声明的所有变量都将占用栈内存。
- 堆:程序中未使用的内存,在程序运行时可用于动态分配内存。
对于确定的变量,通常在栈上进行内存空间申请。 对于无法提前预知需要多少内存来存储某个定义变量的特定信息,所需内存的大小需要在运行时才能确定时,可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存。
申请动态内存时使用new
,不需要动态内存需要释放时使用delete
new和delete
new
语法:
1
new data-type;
data-type
可以是包含数组在内的任意内置的数据类型,也可以包括类或结构在内的用户自定义的任何数据类型。
使用示例:
1
2
3
4
5
6
7
double* pvalue = NULL;
if( !(pvalue = new double ))
{
cout << "Error: out of memory." <<endl;
exit(1);
}
上面的程序声明了一个指针变量pvalue
,并且分配了一个double
字节大小的内存
delete
1
delete pvalue; // 释放 pvalue 所指向的内存
使用示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
int main ()
{
double* pvalue = NULL; // 初始化为 null 的指针
pvalue = new double; // 为变量请求内存
*pvalue = 29494.99; // 在分配的地址存储值
cout << "Value of pvalue : " << *pvalue << endl;
delete pvalue; // 释放内存
return 0;
}
数组的动态内存分配
- 字符串数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cstring>
using namespace std;
int main ()
{
char *pvalue = NULL; // 初始化为null的指针
pvalue = new char[20]; // 为变量请求内存
strcpy(pvalue, "Hello World");
cout << pvalue << endl;
delete[] pvalue;
return 0;
}
- 二维数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;
int main ()
{
// 1. 分配行指针数组
double **pvalue = new double*[3];
// 2. 为每一行分配列,并且初始化
for (auto i = 0; i < 3; i++) {
pvalue[i] = new double[4];
for (auto j = 0; j < 4; j++) {
pvalue[i][j] = i + j;
}
}
// 3. 输出数组
for (auto i = 0; i < 3; i++) {
for (auto j = 0; j < 4; j++) {
cout << pvalue[i][j] << " ";
}
cout << endl;
}
// 4. 释放内存 (先释放每一行,再释放行指针数组)
for (auto i = 0; i < 3; i++) {
delete[] pvalue[i];
}
delete[] pvalue;
return 0;
}
对象的动态内存分配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
class Box
{
public:
Box() {
cout << "调用构造函数!" <<endl;
}
~Box() {
cout << "调用析构函数!" <<endl;
}
};
int main( )
{
Box* myBoxArray = new Box[4];
delete [] myBoxArray; // Delete array
return 0;
}
本文由作者按照 CC BY 4.0 进行授权