C 中指標與動態記憶體分配和記憶體洩漏問題

2021-06-25 14:44:04 字數 2136 閱讀 4421

1樓:留下痕跡的人生

int main()

這段**沒有造成洩漏

int main()

這段**出現記憶體洩漏了

int *p = new int // 申請一塊堆區記憶體,就給個名為f吧,現在p指向f

p = &a; // p指向變數a,是個區域性變數,在棧上分配,此時沒有任何指標堆區記憶體塊f

// 記憶體f就被孤立起來,無法進行釋放,修改等操作了,等同於無法使用的記憶體

// 當有一塊記憶體既無法釋放也無法使用時,這就是記憶體洩漏

// new申請的記憶體是堆區記憶體,通過手動(new)分配,手動(delete)**,工具是指標

// 區域性變數的記憶體是棧區記憶體,自動分配,自動**。

2樓:

new的物件不釋放才會導致記憶體洩漏。

後一段** p指標初始化的時候分配了新的記憶體空間(new int),然後p又被賦值指向了a空間,之前指向的新int記憶體沒有釋放,會一直佔用,導致記憶體洩漏問題。

指標自身佔用4個位元組,儲存的是另一處記憶體空間的地址,對指標變數的賦值操作只會改變其儲存的目標地址,而目標地址處的記憶體空間不受影響。理解了指標,可以更好理解它的運用。

3樓:寒寒家

只有new,malloc這類動態申請記憶體的方式,才可能出現記憶體洩露。

這些方式,申請的記憶體在堆上,不會隨著程式(或函式)的結束而被自動的釋放,必須手動的釋放記憶體。

而第一個例子中,都是區域性變數,區域性變數都在棧裡,都會隨著程式(或函式)的結束,而被釋放。

4樓:匿名使用者

int a = 0;該資料分配在棧(stack)裡,不需要手動釋放。int *p = &a,該指標p所指的地址就是棧內地地址,所以不需要手動釋放,所以不會記憶體洩漏。

int *p = new int;也就是在堆(heap)中分配一塊記憶體,地址儲存在p中。堆上申請的記憶體需要手動釋放(delete p;),否則就會記憶體洩漏.你又將p指向了a的地址,那麼原來在堆中分配的那塊地址由於未及時釋放,現在找不到它的地址了(本來是儲存在p中的),就無法再被使用。

「兩者同樣都是被另一地址給覆蓋」:你要搞清楚一個問題,不管是int *p = &a;還是int * p = new int; p指標本身還都是在棧上,不過前者p的值是a的地址,後者p的值是new的一個堆上的地址,記憶體洩漏並不是p所在記憶體洩漏,而是它所指的那塊地址。

好好思考一下:記憶體洩漏,堆疊的概念吧。

c++ 動態分配記憶體 記憶體洩漏問題 new

5樓:匿名使用者

可以,只要對相同地址new和delete配對使用都會正確**記憶體。更好的辦法是使用智慧指標unique_ptr和shared_ptr。

6樓:無非灬依舊

可以解決,因為申請的指標q已經指向了p申請的這個int例項,delete的話就是把這個動態分配的空間給釋放掉,所以這種方式是可以解決這裡的記憶體洩露問題。

c++ 關於記憶體洩露問題。記憶體洩露是指用new 分配的記憶體沒有用delete釋放,如果未釋放會有什麼後果?

7樓:匿名使用者

你家只有那麼大,你買了越來越多的東西,舊的東西不丟掉會怎樣?

會滿的。記憶體未釋放,可用記憶體慢慢就滿了,其他程式執行不了,系統也越來越慢。

陣列記憶體訪問越界,還沒有洩露呀

8樓:匿名使用者

越界是訪問了不被允許的記憶體空間,也就是一段x記憶體地址是屬於a程序,另一段y地址是屬於b程序,如果a程序突然間修改了y地址上的內容,就會有可能導致系統崩潰

記憶體洩露,是指記憶體申請的空間,在使用完後,沒有被釋放。c/c++最顯著特點是指標控制。但new的記憶體必須手工是否,如果用完後沒有釋放。

那麼就會浪費了系統資源,反覆洩露的話,有可能導致系統資源不足崩潰

9樓:

一樓講得很詳細了,補充一點,c++的陣列是一個指向第一個元素地址的指標,所有的元素是一段連續的記憶體地址,所以,陣列越界會導致該指標指向別的記憶體地址,導致記憶體洩露

10樓:匿名使用者

作業系統會在應用程式結束後釋放堆疊資料**的記憶體,所以。。。。作業系統挺友善。。。。到這樣是很不好的。***

C 中指標符號問題,在C 中,指標中, 符號有什麼用?應該怎麼用,謝謝了,我是初學者。

1.n p 有兩個可能。首先,class nint main 然後再一個可能就是n乘以p。2.n p表示什麼意思 n p就是取p的地址賦值給指標nn p的意思是取p的地址給n變數注意指標變數只能初始化,不能賦值給他。也就是說int p int n p 是可以的。但是分開來就是不對的了。如果你是新手的...

VRay系統下面的「動態記憶體極限」是什麼意思,如何使用

動態記憶體限制指的是對動態光線投射器所使用的總記憶體量的限制,用於動態的生成幾何體。這裡所說的總記憶體指的是電腦上實際所安裝的記憶體 記憶體,ram 量,要注意的是記憶體共用區 memory pool 是由各個渲染執行緒所共享的。因而,如果需要過於頻繁的載入與載出幾何體,各執行緒必然會相互等待對方,...

C語言指標函式,c語言中指標怎麼使用?

應該是的,還可以用f a i 的形式。去程式設計嗎?我學這些的是一頭霧水。c語言中指標怎麼使用?1 使用場景 使用指標時,必須將它指向一個變數的地址或者為它分配 空間方能使用,如下所示 include include int main int argc,char const argv int b,d...