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


    动态分配

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

    int *pNumber;
    
    pNumber = new int;

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

    double *pDouble;
    
    pDouble = new double;

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

    复制代码
    #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);
    
    }
    复制代码

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

    内存分配和内存释放

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

    delete pPointer;

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

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

    复制代码
    #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;
  • 相关阅读:
    怎样创建动态扩容数组?
    怎样终止一个线程?
    模式识别
    基于Linux根据僵尸网络病毒平台《比尔盖茨》
    web.xml在&lt;init-param&gt;一个错误
    DTD学习笔记
    Java排序算法(四):Shell排序
    VC6迁移到VS2008几个问题——良好的代码,从我做起,从现在开始。
    Maven 建 Struts2 基本实现 CURD Controller
    Andy&#39;s First Dictionary
  • 原文地址:https://www.cnblogs.com/smallfa/p/6277331.html
Copyright © 2020-2023  润新知