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

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

1樓:xxiao文

如果程式還在執行記憶體開闢的東西不會丟失,重啟之後你沒執行程式當然記憶體的東西會自動消失難道還累加啊 那你那程式豈不是比病毒還可怕,這些寫程式很基本的不釋放記憶體的程式不是好程式...

2樓:

new之後不delete,被分配的記憶體不會永遠丟失,而是一直被佔用。

系統重啟,被分配的記憶體別說使用,就是你分配記憶體的這個程式也不能使用,或者重新執行。

3樓:炫影霜星

關機後ram中內容都會丟失。

4樓:

在c++中可以用new和malloc在堆上申請空間,並且必選相應地用delete和free進行釋放空間,因為在c++編譯器中,堆這部分儲存空間是完全由程式設計師自己管理的,即由程式設計師自己分配和釋放。如果在程式中用new和malloc申請了空間的話,但是在程式中沒有手動用delete和free釋放空間的話,在程式執行過程中以及程式執行完畢後,這段空間還是被佔用,即無法再訪問到這部分空間,事實上這就是所謂的「記憶體洩露」問題。但是在你電腦重啟後,這部分空間會被釋放的,不會一直被佔用,在程式中可以重新訪問到這部分儲存空間。

c++中給結構體分配動態記憶體的問題……用new嗎 怎麼用?

5樓:非常可愛

c++中給結構體分bai配動態du記憶體是用new。

示例:struct mystruct

mystruct *pmysrt=new mystruct;

pmysrt->a=1;

pmysrt->b='a';

cout

擴充套件資料zhi

c++中new的用法

dao1、呼叫operator new分配記憶體,operator new (sizeof(a)) ;

版2、呼叫建構函式生成權類物件,a::a() ;

3、返回相應指標 ;

4、分配記憶體這一操作就是由operator new(size_t)來完成的,如果類a過載了operator new,那麼將呼叫a::operator new(size_t ),否則呼叫全域性::operator new(size_t ),後者由c++預設提供。

6樓:匿名使用者

直接new就可以bai了,不過c結構du

體如果定zhi義在.h檔案dao裡,最好回加上,避免出答錯#ifdef _cplusplus

extern "c"pos;

#ifdef _cplusplus

}#endif

pos *p = new pos;

delete p;

7樓:匿名使用者

注意c++和c的函式

bai庫不同喵~

realloc 只是du 「從操zhi作dao系統中分配記憶體給回當前程序」

new 預設答包含「從作業系統分配記憶體給當前程序,並使用建構函式初始化該記憶體區域」 兩個操作。

如果只是想要在c++裡面編譯通過,加上 extern "c" {} 關鍵字註釋c**塊即可喵。

8樓:小忍and奏

void buildstack(stack *s){(*s).base=(m*)new((&(*s).base) sizeof((*s).

base))char[((*s).stsize 100)*sizeof(m)];

……bai

new(地址du)型別[大小

zhi]

delete &(*s.base) //釋放dao應該

內是這樣容吧

9樓:

比如:pos *p;

p=new pos;

if(!p)

p->i=3;

p->=i*i;...

10樓:匿名使用者

可以用new和delete,和使用普通變數一樣

11樓:粟筠項奇思

c++中是沒有結構抄體的,從baic繼承來的struct已經變成類了,而不再du只是一個zhi結構體,直接new就可以了。dao

#include

struct

myclass

;myclass::myclass(intarg)

myclass::myclass()

void

myclass::show()

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

12樓:匿名使用者

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 對應使用

13樓:匿名使用者

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

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

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

14樓:匿名使用者

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;

15樓:匿名使用者

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

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

16樓:匿名使用者

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

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

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

17樓:匿名使用者

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

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

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

18樓:

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

19樓:匿名使用者

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

C語言動態分配記憶體為什麼總是提示警告?可以執行

北問邇 1.就算沒有free main 結束後也是會自動釋放malloc 的記憶體的,這裡監控者是作業系統,設計嚴謹的作業系統會登記每一塊給每一個應用程式分配的記憶體,這使得它能夠在應用程式本身失控的情況下仍然做到有效地 記憶體。你可以試一下在taskmanager裡強行結束你的程式,這樣顯然是沒有...

C語言為陣列動態分配記憶體並賦值,為什麼第一種方法正確,第二種方法錯誤

一般來說,記憶體需要用多少,就開闢多少,如果你非要用迴圈的方式不斷的增加記憶體大小,建議你用以下方法 關鍵是用到函式realloc,這個函式的作用,網上很多,可以去查查。主要是用來在原有記憶體空間的基礎上,增加記憶體空間大小的。include include void main for i 0 i ...

關於c語言動態分配二維陣列的問題

如果要求行列都是動態的話,最簡單的辦法就是這樣,n行m列 int p int malloc sizeof int n for int i 0 i n i p i int malloc sizeof int m 然後就可以這樣傳遞 void f int p f p 不過用完了還要一個一個的去free ...