C++ | C++动态内存
C++动态内存
- 栈:在函数内定义的变量,都将在栈中分配内存空间。
- 堆:这是程序未使用的内存空间,在程序运行过程中可以动态分配。
很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。
在 C++ 中,您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。
这种运算符即 new 运算符。
如果您不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。
malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不要使用 malloc() 函数。
new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。
new 和 delete 运算符
new data-type; //new为任意类型的数据动态分配内存的语法
实例1:
double* pvalue = NULL; /* 初始化为NULL的内存指针 */
if( !(pvalue = new double )) /* 为变量申请内存 */
{
cout exit(1);
}
delete pvalue; /* 释放pvalue所指向的内存空间 */
实例2:
/*******************************************************************
* > File Name: new.cpp
* > Create Time: 2021年09月13日 23:06:38
******************************************************************/
#include
using namespace std;
int main(void)
{
double *pvalue = NULL; /* 初始化为NULL的内存指针 */
pvalue = new double; /* 为变量申请内存 */
if(pvalue == NULL) /* 申请失败 */
{
cout exit(-1);
}
*pvalue = 199.99; /* 赋值 */
cout delete pvalue; /* 释放pvalue所指向的空间 */
return 0;
}
编译、运行:
PS D:2.SoftToolscygwin64homeflyworkSpacecplusplusday1> make
g++ -o new new.cpp -g -Wall
PS D:2.SoftToolscygwin64homeflyworkSpacecplusplusday1> .new.exe
value of *pvalue: 199.99
数组的动态内存分配
一维数组
// 动态分配,数组长度为 m
int *array=new int [m];
//释放内存
delete [] array; /* 删除array所指向的数组 */
二维数组
/*******************************************************************
* > File Name: two-dimensianal-arr.cpp
* > Create Time: 2021年09月15日 22:21:31
******************************************************************/
#include
using namespace std;
int main(void)
{
int **array; // 二维数据
const int m = 3; // 第一维长度为m
const int n = 2; // 第二位长度为n
array = new int *[m];
for(int i = 0; i {
array[i] = new int [n];
}
for(int i = 0; i {
delete [] array[i];
}
delete [] array;
return 0;
}
实例3:
/*******************************************************************
* > File Name: two-dimensianal-arr2.cpp
* > Create Time: 2021年09月15日 22:38:27
******************************************************************/
#include
using namespace std;
int main(int argc, char* argv[])
{
int **p;
int i,j; // p[4][8]
p = new int *[4]; // 4组int型指针
for(i = 0; i {
p[i] = new int [8];
}
/* 赋值 */
for(i = 0; i {
for(j = 0; j {
p[i][j] = i*j;
}
}
/* 输出 */
for(i = 0; i {
for(j = 0; j {
if(0 == j)
{
cout }
cout }
}
cout
/* 开始释放申请的堆 */
for(i = 0; i {
delete [] p[i];
}
delete [] p;
return 0;
}
编译、运行:
PS D:2.SoftToolscygwin64homeflyworkSpacecplusplusday2> make
g++ -o two-dimensianal-arr2 two-dimensianal-arr2.cpp -g -Wall
PS D:2.SoftToolscygwin64homeflyworkSpacecplusplusday2> .two-dimensianal-arr2.exe
0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7
0 2 4 6 8 10 12 14
0 3 6 9 12 15 18 21
三维数组
实例4:
/*******************************************************************
* > File Name: three-dimensional-arr.cpp
* > Create Time: 2021年09月15日 23:04:10
******************************************************************/
#include
using namespace std;
int main(int argc, char* argv[])
{
int i,j,k; // [2][3][4]
int ***p;
p = new int **[2];
for(i=0; i {
p[i] = new int *[3];
for(j=0; j {
p[i][j] = new int [4];
}
}
for(i=0; i {
for(j=0; j {
for(k=0; k {
p[i][j][k] = i*j*k;
cout }
cout }
cout }
for(i=0; i {
for(j=0; j {
delete [] p[i][j];
}
}
for(i=0; i {
delete [] p[i];
}
delete [] p;
return 0;
}
编译、运行:
PS D:2.SoftToolscygwin64homeflyworkSpacecplusplusday2> make
g++ -o three-dimensional-arr three-dimensional-arr.cpp -g -Wall
PS D:2.SoftToolscygwin64homeflyworkSpacecplusplusday2> .three-dimensional-arr.exe
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 1 2 3
0 2 4 6
对象的动态内存分配
实例5:
/*******************************************************************
* > File Name: newObj.cpp
* > Create Time: 2021年09月15日 23:20:49
******************************************************************/
#include
using namespace std;
class Box{
public:
Box()
{
cout }
~Box()
{
cout }
};
int main(int argc, char* argv[])
{
Box *pbox = new Box[4];
delete [] pbox;
return 0;
}
编译、运行:
PS D:2.SoftToolscygwin64homeflyworkSpacecplusplusday2> make
g++ -o newObj newObj.cpp -g -Wall
PS D:2.SoftToolscygwin64homeflyworkSpacecplusplusday2> .newObj.exe
Calling constructor.
Calling constructor.
Calling constructor.
Calling constructor.
Calling destructor.
Calling destructor.
Calling destructor.
Calling destructor.
# 如果要为一个包含四个 Box 对象的数组分配内存,构造函数将被调用 4 次,
# 同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net