C ++ 内存 | C/C++的动态内存管理_1

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,申请一个新地址的内存。


对代码不满足,是任何真正有天才的程序员的根本特征。

猜你喜欢

转载自blog.csdn.net/sw3300255/article/details/84934926