C/C++的动态内存管理
1、
C语言中,我经常会用到动态内存管理的三个命令:
malloc
calloc
rolloc
free
(1)malloc
用来申请head内存空间的内存。
(2)calloc
malloc 和 calloc 之间,当 malloc 分配一些内存时,它不会初始化具有任何值的字节,因此如果你没有在分配的这些地址中填入任何值,通过 malloc ,你会有一些垃圾值,但如果你通过 calloc 分配内存,calloc 将所有字节位置设置为零值。所以,它也初始化了内存。
(3)realloc
void* realloc(void* Ptr, size_t sige)
第一个参数指向现有块的起始地址的指针,第二个参数是大小新区块。reallo 中可能存在几种情况,即新块的大小,我们想要的可能比前一个块的大小更大。在那种情况下,机器可以创建一个全新的块并复制先前的数据。如果连续或连续的内存已经可用对于现有块,也可以扩展现有块。
(4)free
释放head的动态内存,如果没有这个中命名,内存容易泄露。
2、
C++语言中,我们也经常会用到动态内存管理的两个命令:
new
delete
直接上码:
(malloc)
#include<iostream>
using namespace std;
int main()
{
int n;
cout << "Enter size of number:" << "\n";
scanf("%d",&n);
int *A = (int*)malloc(n*sizeof(int));
for(int i=0; i<n; i++)
{
A[i] = i + 1;
}
for(int i = 0; i<n; i++)
{
printf("%d ", A[i]);
}
}
运行结果:
(calloc)
#include<iostream>
using namespace std;
int main()
{
int n;
cout << "Enter size of number:" << "\n";
scanf("%d",&n);
int *A = (int*)calloc(n, sizeof(int));
for(int i = 0; i<n; i++)
{
printf("%d ", A[i]);
}
}
运行结果:
注意:
calloc 在没有给数组赋值之前,它会初始化数组为0。
如果使用 malloc,内存分配一些垃圾值。
(free)
#include<iostream>
using namespace std;
int main()
{
int n;
cout << "Enter size of number:" << "\n";
scanf("%d",&n);
int *A = (int*)malloc(n*sizeof(int));
for(int i=0; i<n; i++)
{
A[i] = i + 1;
}
free(A);
for(int i = 0; i<n; i++)
{
printf("%d ", A[i]);
}
}
运行结果:
注意:
可以看到我们已经释放 数组A 的内存成功。它的输出值是一些垃圾值。
但你可以看到 A[4] 是等于5,在某些机器上,这样的程序可能会导致我们的程序崩溃,我们应该始终确保使用已分配的内存,否则就像在黑暗中行走,我们不知道会发生什么。
(realloc)
#include<iostream>
using namespace std;
int main()
{
int n;
cout << "Enter size of number:" << "\n";
scanf("%d",&n);
int *A = (int*)malloc(n*sizeof(int));
for(int i=0; i<n; i++)
{
A[i] = i + 1;
}
int *B = (int*)realloc(A, 2*n*sizeof(int));
printf("prev block address = %d , new address = %d\n",A,B);
for(int i = 0; i<2*n; i++)
{
printf("%d ", B[i]);
}
}
运行结果:
注意:
这里输出 1 2 3 4 5 0 0 0 0 0 ,其余都是垃圾值,前五个数字是 数组A的,后面我们使用 realloc 扩展该指针的内存(2*n*sizeof(int)),增加了调用的内存。
如果减少内存呢?
#include<iostream>
using namespace std;
int main()
{
int n;
cout << "Enter size of number:" << "\n";
scanf("%d",&n);
int *A = (int*)malloc(n*sizeof(int));
for(int i=0; i<n; i++)
{
A[i] = i + 1;
}
int *B = (int*)realloc(A, (1/2)*sizeof(int));
printf("prev block address = %d , new address = %d\n",A,B);
for(int i = 0; i<2*n; i++)
{
printf("%d ", B[i]);
}
}
运行结果:
注意:
我这里出现这个错误,我使用的是C++,在C是可以运行的,而且编译器把5个值显示成2个值,其他值被释放了。
如果把内存大小设置为了0, int *B = (int*)realloc(A, 0); 那么A就会被释放了。这个语句就变成了free()。
如果把数组参数设置成Null?
#include<iostream>
using namespace std;
int main()
{
int n;
cout << "Enter size of number:" << "\n";
scanf("%d",&n);
int *A = (int*)malloc(n*sizeof(int));
for(int i=0; i<n; i++)
{
A[i] = i + 1;
}
int *B = (int*)realloc(Null, n*sizeof(int));
printf("prev block address = %d , new address = %d\n",A,B);
for(int i = 0; i<2*n; i++)
{
printf("%d ", B[i]);
}
}
运行结果:
注意:
int *B = (int*)realloc(Null, n*sizeof(int));
把参数设置为Nul,这条语句相当于 malloc,申请一个新地址的内存。
对代码不满足,是任何真正有天才的程序员的根本特征。