堆中分配的内存如何释放空间。
如果在栈中动态分配对象,那么这个对象随着这个函数SCOPE结束就释放了?还是就指针变量空间释放了,但是对象的内存空间还在,那么一定要定义一个全局的指针变量?
希望能得到HELP.

解决方案 »

  1.   

    new分配的就用delete释放
    malloc分配的内存就用free释放
      

  2.   

    栈中动态分配对象,那么这个对象随着这个函数SCOPE结束就释放了。
    它是这样实现在(这里假定一个动态对象):进入函数时,栈指针向上移一个对象大小,这时在这个函数内就可以操作这个对象了,当函数退出时,栈指针又移回原处,这样这个空间就不可确定了,如果这个空间未被覆盖过,那么应该还是可以通过指针来访问的。
      

  3.   

    在Window中执行的每一个应用程序都有其自己的内存地址。一部分内存空间用于存放程序代码,一部分内存空间用于存放程序执行期间
    创建的变量。创将变量的方法有两种,一种是在堆中,另外一种则在堆栈里。理解堆的最好的方法是将它看成一个程序随时可以使用的内存块。为了创建堆变量,程序要使用“new”(在C++里)操作符或者
    “malloc”(在C中)例程,它们返回指向变量的指针(堆变量总是通过指针来处理和操作)。最后程序用“delete”(在C++里)操作符
    或者“free”(在C中)例程来删除或者释放内存空间。而堆栈则不同,它是某个函数被调用后随时可以创建的一小块内存,被用于在函数范围内保存变量(也称为自动变量)。在函数中,任何
    包含在{}内的代码都有其自己的堆栈。当这个函数或者{}退出时,堆栈以及它包含的所有内容都被摧毁。因此下面的代码是不运行的:
    void Myfunction()
    {
       int i = 5;   {
          int j = 6;
       }   int k = i+j;
    }所以本文问题的答案是:使用堆栈(stack)分配本地或者局域变量的地址空间,而用堆(heap)分配大块内存地址或者动态创建对象的情形。
    例如:void MyFunction()
    {
       int i = 5; // 堆栈中的本地(自动)变量
       int *iArray; // 堆栈中的本地(自动)变量   iArray = new int[10000]; // 这一行代码将在堆中创建10000个元素的数组,由iArray指向其地址   for (int k = 0; k <  10000  ; k++)
       {
           iArray[k] = k + i;
           cout << iArray[k] << "\n";
       }   delete iArray; // 从堆中删除或释放数组占用的地址空间,否则将会有内存泄漏
    } //函数结束注意:iArray 不是一个堆变量。它是一个局部指针变量,指向堆中未命名的一个数组
      

  4.   

    在delete一个指针后,最好再赋给该指针一个空值。防止出现"野指针"。
    比如:delete pointer;
          pointer = NULL;
      

  5.   

    谢谢大家回答,分数我会狂加的!!:)我的理解是,stack 中分配的内存(包括普通变量和对象变量)由系统自己来决定生命周期(由{}定义的范围)而heap中分配的内存的生命周期是由用户自己来决定的!
    我的意思是:
        那么如果我在函数(stack)中动态分配内存(heap)的对象或则普通变量怎么管理他们的生命期!~  
    如: 
    void MyFunction()
    {
       int i = 5; // 堆栈中的本地(自动)变量
       int *iArray; // 堆栈中的本地(自动)变量
       CobjTemp *objTmp= new CobjTemp();// 在堆中分配内存!
       //do something.
     }
    那么objTemp是指向CobjTemp大小的内存空间.但是objTemp在这里随着MyFunction的范围结束而生命期结束。那么这个new 的堆内存空间就会出现内存泄露?我们没办法来释放它!!
    所以要定义一个全局的变量来控制,
    CArray arrTemp; 
    void MyFunction()
    {
       int i = 5; // 堆栈中的本地(自动)变量
       int *iArray; // 堆栈中的本地(自动)变量
       CobjTemp *objTmp= new CobjTemp();// 在堆中分配内存!
    arrTemp.Add(objTemp);
     }
    这样我还可以控制住这个objTemp所在的内存空间。不知道大家是怎么来处理的。
    如果我有个函数是用来动态生成飞机对象的,根据实际的情况来生成飞机。那么我要有一个全局的集合对象来管理他们,比如CaircraftCarrier 来管理,不知道大家是如何处理?如果只有一个对象,那么我就直接定义为全局变量了,我总是决定这个动态性不够。另外,很同意 free_card(痛并快乐着) 
    //
    //所以本文问题的答案是:使用堆栈(stack)分配本地或者局域变量的地址空间,而用堆
    //(heap)分配大块内存地址或者动态创建对象的情形。
      

  6.   

    up!可能我表达不清楚,我再来写一下。
    A。什么时候要用到堆内存分配?
     1.分配大块内存地址。
       2.动态创建对象的情形,不能确定要生成多少对象的情况下。
    还有么?
    B。动态创建对象如何来控制对象的生命周期,大家是 如何处理得?
    谢谢!!!!!!~~
      

  7.   

    我觉得动态创建对象主要是非常的灵活 对象实体都在堆中
    我们通过指针就可以灵活的对它们操作
    关于生命期 不用了就delete...