程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C/C++中程序在使用堆內存時的內存復用問題

C/C++中程序在使用堆內存時的內存復用問題

編輯:C++入門知識

在一個C/C++程序中,如果使用了堆內存的管理機制,那麼內存究竟是怎麼分配與回收的呢?

先看一個程序:

 

#include <iostream>

using namespace std;

int main (void)
{
    int *x = new int;
    int *y = new int;
    *x = 1;
    *y = 2;
    cout << "*x = " << *x << endl;
    cout << "x = " << x << endl;
    delete x;
    int *z = new int;
    *z = 3;
    cout << "*z = " << *z << endl;
    cout << "z = " << z << endl;
    *x = 5;
    cout << "*z = " << *z << endl;

    return 0;
}

這裡是因為程序使用了堆的內存管理機制,存在內存復用的問題。整個過程是:在程序釋放了x的把內存時,緊接著又分配了z的內存,這就是問題的所在,因為這時的z占據了原來是x的內存,這就是說現在x和z的地址相同!!!這時一個可怕的bug,因為一個本該是無效的指針x現在卻可以改變有效指針z指向的內容!!那怎麼辦呢?其實我們可以這樣,每次將一個指針指向的堆內存空間釋放的時候,都將指針清空,即要在delete之後加上這句代碼:

x = NULL; 或者 x = 0;

雖然將一個指針清空可能使程序崩潰,但是我們寧願使程序崩潰也不願意讓程序變得極難調試,因為當程序崩潰時,我們觀察一下即可發現問題所在,但是像上面那樣的程序是很難找到問題出在哪的!!!

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved