標籤:

c++函數中new申請的內存是如何釋放的?

int* test1(int* i){
i = new int;
*i = 10;
return i;
}

void test2(int* i){
*i = 11;
}

void test3(int* i){
i = new int;
*i = 12;
}

int main(){
int *a;
a = test1(a);
cout &<&< "test1: " &<&< *a &<&< endl;// 10 int *b; b = new int; test2(b); cout &<&< "test2: " &<&< *b &<&< endl;// 11 int *c; test3(c); cout &<&< "test3: " &<&< *c &<&< endl;// 25 應該是未定義值 } 觀察test3和test1,為什麼test1就能輸出函數中分配的內存中的值,而test3中就是輸出未定義的值呢? 我應該是明白了,謝謝大家! void test3(int* i){//實參c傳入,等價於 i = c i = new int;//這個地方相當於把 i 指向了一個新的地方,因此最後輸出未定義 *i = 12; }


X void test3(int* i)

O void test3(int* i)


test3這麼寫

#include &

using namespace std;

void test3(int** i)
{
*i = new int;
**i = 12;
return;
}

int main()
{
int* c;
test3(c);
cout &<&< "test3: " &<&< *c &<&< endl; return 0; }


這些函數參數都是值傳遞的,所以test3中的i保存的只是c中保存的地址的一個拷貝,你new之後i就指向別的位置了,然後你給這個新的位置賦值為12,其實跟原來的c沒卵關係。你的*c沒有賦值,當然就是未定義的咯。

那題主可能又要問了,為什麼test1能得到正確的值呢?這當然是因為你把test1的返回值,也就是你在test1里new出來的新地址賦給a了呀!換句話說,這時候的a已經不是原來的a了,識得唔識得噶?


這不顯然??test3隻不過將函數的的形參 i 賦值為通過 new 分配的那個 int 型空間地址的地址數值而已。。外面的那個 c 中的內容還是 外面函數調用棧中 c 那個部分的內容,是一個隨機不確定的內容。。你直接操作那段內容的地址,顯然可能(可能,而非一定,是因為可能那個地址對應的內存區塊,正好已經是分配到當前進程,結果程序沒有寫對,但可以正常運行)操作了一個不屬於當前進程的內存區域。。

你那裡不管對 test3裡面的 i 進行什麼操作,外面的 c 又不會受影響。


new 一個指針之後它的對象就在堆里了,直到你delete它。否則有可能它的對象一直在裡面,即使沒指針指它。


推薦閱讀:

c語言如何實現面向對象功能?
遊戲中注入dll是什麼意思,具體怎麼實現的?
第05集:在Photoshop或Bridge中打開圖片『Photoshop CC 2017 one-on-one基礎篇』
PS教程:創建一個James White風格懷舊海報
第33集:保留細節上採樣『Photoshop CC 2017 one-on-one基礎篇』

TAG:CC |