C++ 动态分配 和 内存分配和内存释放

时间:2023-12-31 18:52:02

动态分配

动态分配可以说是指针的关键所在。不需要通过定义变量,就可以将指针指向分配的内存。也许这个概念看起来比较模糊,但是确实比较简单。下面的代码示范如何为一个整数分配内存:

int *pNumber;

pNumber = new int;

第一行申明了一个指针pNumber,第二行分配一个整数内存,并且将pNumber指向这个新内存。下面是另一个例子,这次用一个浮点数:

double *pDouble;

pDouble = new double;

动态分配有什么不同的呢?当函数返回或者程序运行到当前块以外时,你动态分配的内存将不会被删除。因此,如果我们用动态分配重写上面的例子,可以看到现在能够正常工作了。

C++ 动态分配 和 内存分配和内存释放
#i nclude <stdio.h>

int *pPointer;

void SomeFunction()

{

    // make pPointer point to a new integer

    pPointer = new int;

    *pPointer = 25;

}

void main()

{

    SomeFunction(); // make pPointer point to something

    printf("Value of *pPointer: %d/n", *pPointer);

}
C++ 动态分配 和 内存分配和内存释放

通读一遍,编译上面的代码,确信你已经理解它是如何工作的。当调用SomeFunction时,分配了一些内存,并且用pPointer指向它。这次,当函数返回时,新内存就完整无缺了。因此pPointer仍旧指向有用的东西。这是因为使用了动态分配。确信你已经理解它了。那么继续向下看,了解为什么上面的程序还会有一系列的错误。

内存分配和内存释放

这里有一个问题,可能会变得十分严重,虽然它很容易补救。这个问题就是,虽然你用动态分配可以方便的让内存完整无缺,确实不会自动删除,除非你告诉计算机,你不再需要这块内存了,否则内存将一直被分配着。因此结果就是,如果你不告诉计算机你已经使用完这块内存,那么它将成为被浪费的空间,因为其它程序或者你的应用程序的其它部分不能使用这块内存。最终将导致系统因为内存耗尽而崩溃。因此这个问题相当重要。内存使用完后释放非常容易:

delete pPointer;

需要做的就是这些。但是你必须确定,你删除的是一个指向你实际分配的内存的指针,而不是其它任何垃圾。尝试用delete已经释放的内存是危险的,并且可能导致程序崩溃。

这里再次举个例子,这次修改以后就不会有内存浪费了。

C++ 动态分配 和 内存分配和内存释放
#include <stdio.h>

int *pPointer;

void SomeFunction()

{

// make pPointer point to a new integer

    pPointer = new int;

    *pPointer = 25;

}

void main()

{

    SomeFunction(); // make pPointer point to something

    printf("Value of *pPointer: %d/n", *pPointer);

    delete pPointer;

}

    int * p = new int;
    * p = 5;
    delete p;     int * p2 = new int[5];
    * p2 = 5;
    delete[] p2;