內存的分配方式有幾種? 動態內存的的傳遞注意事項!


1、內存的分配方式分為   靜態存儲區、棧、堆。

靜態存儲區:內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在,比如   全局變量。

棧:在棧上創建,在函數(main函數或其他子函數)執行期間,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動釋放。所以我們不能返回在函數內部定義的變量(函數內定義的指針可以返回),因為他們在函數執行結束時已經被銷毀了。處理器的指令集中有關於棧內的分配運算,因此效率很高,但是分配的內存資源有限。

堆:從堆上分配,亦稱為動態內存分配,使用new或malloc等申請任意多內存,程序員自己決定何時釋放內存,使用靈活,問題也經常出現在這里。

2、動態內存的傳遞:

首先,子函數內不能返回出指針之外的其他變量,http://www.cnblogs.com/audi-car/p/4753292.html

其次,調用子函數時,編譯器默認情況下,會自動為參數列表的每個參數制作臨時的變量,這些臨時變量的改變並不能真正傳回到主函數內,且這些臨時變量會在函數調用結束時,自動銷毀(動態申請的內存除外,它不會銷毀)。所以靠他們來實現參數或者內存的傳遞純屬扯淡。

最典型的例子,就是比較基礎的swap()函數,還有下面這個例子:

void getMemory(char *p)
{
    p=new char[10];
}

int main(int argc, char **argv)
{
    char *str=NULL;
    getMemory(str);
    //char *str=new char[10];
    cout<<str<<endl;
    return 0;
}

在執行cout<<str<<endl;時,程序會崩潰。因為這個指針沒有初始化,也沒能從子函數內申請到內存空間,是指向未知位置的,所以會崩。。

image

3、怎么解決第2步的問題?

很簡單,用引用就可以解決了

void getMemory(char *&p)    //使用引用
{
    p=new char[10];
}

int main(int argc, char **argv)
{
    char *str=NULL;
    getMemory(str);
    //char *str=new char[10];
    cout<<str<<endl;
    return 0;
}
image

4、為什么使用引用就可以解決問題了呢?

因為這個時候,編譯器就不會在給參數p制作一個臨時變量了,我們明確指出了這是一個副本(引用,其實就是被引用對象的副本),他在子函數執行結束的時候也就不會在被釋放了。

以上內容,個人觀點,歡迎指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM