c 子函式中用new而不delete,那麼這部分空間是否會

時間 2021-08-16 03:08:23

1樓:匿名使用者

子函式中使用了new而不delete,通常是不會釋放的空間的。

記憶體被new出來以後,有一個指標指向這個空間。不管是在子函式中,或是在主函式中,都必須有一次delete來釋放這個空間,如果沒有做delete,即使退出程式,也無法**這段記憶體了,記憶體就被洩露了。。

2樓:匿名使用者

不會 因為他們是被分配在堆上的

在你delete之前 他是不會自動**的

當你退出 或結束程式的時候 系統會**這些資源 這跟windows分配給你的是虛擬記憶體有關

不過這些都是系統的功能 與c++無關

3樓:匿名使用者

malloc 和 new申請的空間是在"堆"上的,平時我們都是用宣告變數來申請空間的,此時申請到的空間是"棧"上的,注意區分「堆」和「棧」。棧上的空間,不需要程式設計師負責釋放,函式返回後自動就會釋放;但是對上的空間,必須由程式設計師用 free 或 delete 釋放,否則就會造成「記憶體洩露」。

你的例子中array所使用的記憶體,在getnew()返回後不會被使用,但是仍然被佔用,也就是說這部分記憶體一直被你的程式佔有。

請教:c++中,在【子函式】中new申請的記憶體用完不刪,會導致記憶體洩露嗎?

4樓:匿名使用者

先來進行分析抄一下:

fucntion函式裡的

int *p = new int[100000];

做的事情

1、申請了一

片記憶體int[100000]

2、申請了了一個指標變數 *p。同時p指向這片記憶體。

在子函式結束以後,會做的事情

1、銷燬指標變數*p

注意:只是銷售了指標變數,並不會自動的**int[100000]這片記憶體

new出的記憶體必須要用delete才會**

結果就造成了這片記憶體 沒有人知道在哪了,因為指向它的指標*p已經被銷燬了。

(當然了,作業系統是知道的。但是它認為你程式中還在使用這片記憶體,因為你沒有delete掉)

這樣你程式一直開著的話,就會一直佔用著這些記憶體,但是實際上你卻沒有使用。

當然你main函式一退出,所有的記憶體就會都**了。

5樓:匿名使用者

首先要清楚堆記憶體和棧記憶體的區別

1.new 和 malloc開闢的是堆記憶體,生命週期由版程式設計師管理,在子函式中開闢的記憶體權,如果不手動的釋放的話,會到程式結束後,才被系統**。

2.普通的變數宣告,在記憶體中是棧記憶體,函式結束之後,生命週期也就結束了。

6樓:匿名使用者

肯定會的.

new出的記憶體必須要用delete釋放.

在c++中,釋放new分配的記憶體空間時,使用delete和delete[]是不是有區別?詳細說明下

7樓:匿名使用者

c++告訴我們在**用 new 分配的單個物件的記憶體空間的時候用 delete,**用 new 分配的一組物件的記憶體空間的時候用 delete。

樓主的這個問題提得很好。很多人注意到了這個問題,但是卻不清楚為什麼要這樣做,不這樣做行不行。

關於 new 和 delete,其中又分為兩種情況:(1) 為基本資料型別分配和**空間;(2) 為自定義型別分配和**空間。

對於 (1),上面提供的程式已經證明了 delete 和 delete 是等同的。但是對於 (2),情況就發生了變化。請看下面的程式。

#include ;

using namespace std;

class t

~t()

};int main()

大家可以自己執行這個程式,看一看 delete p1 和 delete p1 的不同結果,我就不在這裡貼執行結果了。

從執行結果中我們可以看出,delete p1 在**空間的過程中,只有 p1[0] 這個物件呼叫了解構函式,其它物件如 p1[1]、p1[2] 等都沒有呼叫自身的解構函式,這就是問題的癥結所在。如果用 delete,則在**空間之前所有物件都會首先呼叫自己的解構函式。

基本型別的物件沒有解構函式,所以**基本型別組成的陣列空間用 delete 和 delete 都是應該可以的;但是對於類物件陣列,只能用 delete。對於 new 的單個物件,只能用 delete 不能用 delete **空間。

所以一個簡單的使用原則就是:new 和 delete、new 和 delete 對應使用

8樓:匿名使用者

如果new得是一個變數,那麼使用delete就可以。

但是如果new得是一個陣列,使用delete的話只能釋放陣列的第一個元素佔用的記憶體,這會造成嚴重的記憶體洩漏的。

使用new申請的陣列應該使用delete來銷燬它。

9樓:匿名使用者

delete一般只釋放用new所分配的,並且只分一個型別的大小的記憶體,每個delete和new對應;而delete釋放用new所分配的,並且為同一種型別的多個元素一次所分配的記憶體。也就是用new一次為一個元素分配記憶體時,用delete;而用new一次為一個集合(陣列)分配記憶體時,用delete。如char *p=new char時用delete p;youclass *pclass=new youclass時用delete pclass;又如用char *p=char[10]時用delete p;youclass *pclass=new youclass[10]時用 delete *pclass;

10樓:匿名使用者

delete 是銷燬一個變數!delete 是銷燬一個變數陣列

c 程式設計中,用new動態分配記憶體後,不使用delete,被分配的記憶體會永遠丟失嗎

xxiao文 如果程式還在執行記憶體開闢的東西不會丟失,重啟之後你沒執行程式當然記憶體的東西會自動消失難道還累加啊 那你那程式豈不是比病毒還可怕,這些寫程式很基本的不釋放記憶體的程式不是好程式. new之後不delete,被分配的記憶體不會永遠丟失,而是一直被佔用。系統重啟,被分配的記憶體別說使用,...

C語言請幫我分析子函式裡面的語句的意思

i和j不是同時移動的,只有當不等於y的時候才是,如果改為同時移動就沒意義了。例如 accd c 1 0,j 0 1 1,j 1 1 2,j 1 1 3,j 2 char fun char x,char y 形參x代表需要進行操作的字串陣列,x j 0 給新字串陣列末尾加 0 char fun cha...

c 中用函式寫冒泡演算法,對int,double,cha

include template void rote type a,type1 b,type2 c else if c max else if c else int k 3 for int i 0 i 3 i case 2 case 3 cout void main template void ms...