我們知道,使用malloc/calloc等分配記憶體的函式時,一定要檢查其返回值是否為「空指標」(亦即是檢查分配記憶體的操作是否成功),這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如果你簡單的把這一招應用到new上,那就不一定正確了。我經常看到類似這樣的**:
int* p = new int[size];
if(p==0) //檢查p是否空指標
return -1;
//其他**
其實,這裡的 if( p==0 )完全是沒啥意義的。c++裡,如果new分配記憶體失敗,預設是丟擲異常的。所以,如果分配成功,p==0就絕對不會成立;而如果分配失敗了,也不會執行if( p==0 ),因為記憶體分配失敗時,new就會丟擲異常跳過後面的**。如果你想檢查new是否成功,應該捕捉異常:
trycatch( const bad_alloc& e )
據說一些老的編譯器裡,new如果分配記憶體失敗,是不丟擲異常的(大概因為那時c++還沒加入異常機制),而是和malloc一樣,返回空指標。不過,我從來都沒有遇到過new返回空指標的情況。
當然,標準的c++亦提供了乙個方法來抑制new丟擲異常,而返回空指標:
int* p = new (std::nothrow) int; //這樣,如果new失敗了,就不會丟擲異常,而是返回空指標
if( p==0 )//如此這般,這個判斷就有意義了
return -1;
//其他**
文章出處:
p.s.
c++中new的用法(
c++中,new的用法很靈活,這裡進行了簡單的總結:
1.new()分配這種型別的乙個大小的記憶體空間,並以括號中的值來初始化這個變數;
2.new分配這種型別的n個大小的記憶體空間,並用預設建構函式來初始化這些變數;
#include
#include
using namespace std;
int main()
輸出結果:
hhello
3. 當使用new運算子定義乙個多維陣列變數或陣列物件時,它產生乙個指向陣列第乙個元素的指標,返回的型別保持了除最最左邊維數外的所有維數。例如:
int *p1 = new int[10];
返回的是乙個指向int的指標int*
int (*p2)[10] = new int[2][10];
new了乙個二維陣列,去掉最左邊那一維[2],剩下int[10],所以返回的是乙個指向int[10]這種一維陣列的指標int(*)[10].
int (*p3)[2][10] = new int[5][2][10]; new了乙個三維陣列,去掉最左邊那一維[5],還有int[2][10],所以返回的是乙個指向二維陣列int[2][10]這種型別的指標int (*)[2][10].
#include
#include
using namespace std;
int main()
輸出結果:
int*
int*
int (*)[2]
int (*)[2]
int (*)[2][3]
int (*)[2][3]
new的(3種)用法詳解
一. 簡介
new有三種使用方式:plain new,nothrow new和placement new。
(1)plain new顧名思義就是普通的new,就是我們慣常使用的new。在c++中是這樣定義的:
plain new在分配失敗的情況下,丟擲異常std::bad_alloc而不是返回null,因此通過判斷返回值是否為null是徒勞的。
(2)nothrow new是不丟擲異常的運算子new的形式。nothrow new在失敗時,返回null。定義如下:
void * operator new(std::size_t,const std::nothrow_t&) throw();
void operator delete(void*) throw();
(3)placement new意即「放置」,這種new允許在一塊已經分配成功的記憶體上重新構造物件或物件陣列。placement new不用擔心記憶體分配失敗,因為它根本不分配記憶體,它做的唯一一件事情就是呼叫物件的建構函式。定義如下:
void* operator new(size_t,void*);
void operator delete(void*,void*);
提示1:palcement new的主要用途就是反覆使用一塊較大的動態分配的記憶體來構造不同型別的物件或者他們的陣列。
提示2:placement new構造起來的物件或其陣列,要顯示的呼叫他們的析構函式來銷毀,千萬不要使用delete。
char* p = new(nothrow) char[100];
long *q1 = new(p) long(100);
int *q2 = new(p) int[100/sizeof(int)];
二.例項
1.plain new/delete.普通的new
定義如下:
void *operator new(std::size_t) throw(std::bad_alloc);
void operator delete(void*) throw();
注:標準c++ plain new失敗後丟擲標準異常std::bad_alloc而非返回null,因此檢查返回值是否為null判斷分配是否成功是徒勞的。
測試程式:
複製**
**如下:
#include "stdafx.h"
#include
using namespace std;
char *getmemory(unsigned long size)
int main()
catch(const std::bad_alloc &ex)
; const nothrow_t nothrow;//nothrow作為new的標誌性啞元
測試程式:
複製**
**如下:
#include "stdafx.h"
#include
#include
using namespace std;
char *getmemory(unsigned long size)
catch(const std::bad_alloc &ex)
~adt()
};int main() 注:
使用placement new構造起來的物件或陣列,要顯式呼叫它們的析構函式來銷毀(析構函式並不釋放物件的記憶體),千萬不要使用delete.這是因為placement new構造起來的物件或陣列大小並不一定等於原來分配的記憶體大小,使用delete會造成記憶體洩漏或者之後釋放記憶體時出現執行時錯誤。
檢查new的返回值
我們知道,使用malloc calloc等分配記憶體的函式時,一定要檢查其返回值是否為 空指標 亦即是檢查分配記憶體的操作是否成功 這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如果你簡單的把這一招應用到new上,那就不一定正確了。我經常看到類似這樣的 int p new int size...
檢查 new 的返回值
我們都知道,使用 malloc calloc 等分配記憶體的函式時,一定要檢查其返回值是否為 空指標 亦即檢查分配記憶體的操作是否成功 這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如果你簡單地把這一招應用到 new 上,那可就不一定正確了。我經常看到類似這樣的 int p new int...
檢查new的返回值及new的用法
我們知道,使用malloc calloc等分配記憶體的函式時,一定要檢查其返回值是否為 空指標 亦即是檢查分配記憶體的操作是否成功 這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如果你簡單的把這一招應用到new上,那就不一定正確了。我經常看到類似這樣的 int p new int size...