判斷用new申請記憶體是否成功

2021-06-22 15:08:53 字數 957 閱讀 4926

c++申請大的記憶體空間(如何判斷失敗)

我想用new申請乙個特別大的空間(多大都可以),主要是我不能判斷到底是成功還是失敗

假如我這樣寫 int *p_i=new int[1024*1024*1024];

網上說判斷p是否為null

可我寫了判斷不出來啊

但是確實失敗了

p[i]=***x;

系統就報錯

解答:lz不用試了,肯定失敗。你想想乙個int是4個位元組。1024*1024*1024個就是4gb。windows每個程序的私有的虛擬記憶體空間大小就只有4gb。你要是都分配了,別的程式**放**啊。

你最好現實一些,一般效能考慮不要一次分配超過50%的記憶體。而且超過5mb以上的大塊記憶體最好不要用new,因為它會在堆裡分配,堆適合小的零碎資料。大塊記憶體請用virtualalloc()直接向os申請。  

char* p=null;//最好初始化為null

p = new char[nsize];  //申請成功的話,p中會儲存一段位址值,也就是p非空

if(p == null)

exit();

....

delete p;

p = null; //刪除後馬上賦值為null  

這種問題在任何程式中都會碰到,就看你的設計了。顯然執行緒之間共享的記憶體位址,用引數傳遞顯然是錯誤的方法(不光是記憶體位址、控制代碼,任何共享變數都有類似問題),不要不捨得用全域性變數,這樣大家說的在delete之後把指標變數、或控制代碼=null,就成立了。(注:被delete的指標變數,"其值不變",當然不會自己變值了,自己賦乙個null值是責任/義務,haha... )

標準c++用丟擲異常來處理new記憶體分配失敗的問題,所以你可以這樣寫:

try

catch(bad_alloc &memexp)

如果分配失敗了,程式就跳過之後的**,輸出錯誤資訊。

更具體的可以參考《effective c++》。 

new與delete申請記憶體

malloc申請而來的只是記憶體,嚴格地說並不是 物件 new delete的引用就是要解決malloc帶來的問題 4個int,16個位元組 int p int malloc 16 for int i 0 i 4 i 在c 中,用new delete操作符取代malloc free 申請乙個物件 i...

new 與malloc申請記憶體區別

首先我們需要了解堆與棧的概念。區分堆記憶體與棧記憶體的區別。以及堆與棧訪問速度的差異的原因。1.屬性 new delete是c 關鍵字,需要編譯器支援。malloc free是庫函式,需要標頭檔案支援。2.引數 使用new 操作副申請記憶體分配時無須制定記憶體塊的大小,編譯器會根據型別資訊自行計算。...

如何為二維陣列用new申請記憶體

要學會怎麼為二維陣列分配記憶體首先要知道二維資料的結構。二維陣列是很多個一維陣列按行排列起來的陣列,所以要建立二維陣列我們得先建立一維陣列然後將這些一維陣列排列起來。那麼一維陣列是怎麼表示的呢?比如 int a 5 就是乙個大小為5的一維陣列,然後我們一般怎麼表示它的記憶體位址呢?int a1 a ...