2016-04-28 50 views
4

我正在學習C++,我知道'新'關鍵字用於將內存中的地址分配給指針。而且我認爲使用'nullptr'時會初始化一個指向無效的指針。那是對的嗎?參考實例:C++:將指針設置爲nullptr並將其初始化爲新變量類型之間的區別

//using nullptr 
int *x = nullptr; //this is just a pointer that points to nothing and 
        //will need to be initialized with an address before it 
        //it can be used. Correct? 

//using new 
int *x = new int; //this is basically giving x an address in memory. Will the 
        //address have some residual value stored in it or will 
        //it contain zero? 

什麼時候可以使用其中一種?新增僅用於動態內存分配還是有其他應用程序嗎?爲什麼要初始化一個指向nullptr的指針?如果你可以聲明它並稍後初始化它?

感謝您的幫助!

回答

0

你的理解是正確的。 nullptr是一個很好的初始化值,表示指針沒有指向內存。此外,nullptr上的delete操作是安全的,而delete上的任意值(這通常是您不初始化指針時的情況)會導致分段錯誤。

使用new時,如果您想將存儲器初始化爲零,則應使用new int()。否則,內存可能有殘留數據。

1

int *x = nullptr;你是排序正確的。 x的值是nullptrnullptr是...呃...讓我們問問專家:What exactly is nullptr?無論如何,它不是什麼都沒有。只有指針可以更好地使用,它才能保證安全的停車位。

int *x = new int讀取x,*x指向的值爲Undefined Behaviour。你可能會得到一個剩餘價值,但誰可以肯定地說?

int *x = new int();*x,將會獲得0

int *x = new int(1000000);*x將獲得100萬

如果你沒有什麼在點,使用nullptr作爲佔位符。不要分配存儲來讓指針指向某處。這是浪費的內存,它浪費時間分配和釋放,如果你忘記delete它是潛在的內存泄漏。 nullptr是安全的。您可以測試nullptr並對其指向的信息的質量做出決定。如果您不確定指針是否正在使用或不在使用,您可以不用擔心會出現不舒服的情況。

+0

第一個不會UB。 'x'只會指向一個未初始化的值。使用未初始化的值將是UB。 –

+0

謝謝。清理措辭。 – user4581301

+0

迂腐:閱讀'* x'是未定義的行爲。讀'x'很好(儘管原始指針值沒有多大用處)。 – ShadowRanger

1
int *x = nullptr; 

// some code here that might under some condition 
// lead to an actual object address being stored in x 

if (x) 
{ 
    // do some stuff here which is only performed if 
    // x doesn't contain a nullptr value anymore 
} 

指針在實際上指向一個對象時並不僅僅是一個目的。一個空指針值是絕對常見的。您可以檢查指針是否爲nullptr,並且該檢查需要指針被初始化。

它不必使用實際地址進行初始化即可使用。

你想要初始化一個指針,就像任何其他基本類型在未初始化時具有不確定的值:爲了直接給它一個有效的值,而不必記住你仍然需要初始化它。

指針變量就像任何其他基本變量一樣。

  • 它駐留具有sizeof(int*)字節的存儲器以存儲類型的地址在堆棧上int
  • 它不會被初始化(indetermined)如果沒有初始化

當你將使用一個在另一個?

第一個(nullptr):如果指針實際上可能保持爲nullptr。 第二個(new int):當你知道你實際上需要分配的整數。 PS:生指針現在實際上應該很少(出於很好的理由)。

0

而且我覺得在使用nullptr的時候初始化一個指向什麼都沒有的指針。那是對的嗎?你什麼時候使用一個?爲什麼要初始化一個指向nullptr的指針?如果你可以聲明它並稍後初始化它?

是的。要記住的重要一點是,只要將內存分配給指針,就必須對其進行管理。所以nullptr是一個標記值,這意味着指針不指向任何東西。

是新的只用於動態內存分配還是有其他的應用程序嗎?

那就是只有功能new。您可以通過放置new來專注於此行爲,但您仍在分配內存。

1

是的,你在描述這兩項任務時通常是正確的。

至於你爲什麼要初始化一個指向NULL的指針的問題,這是爲了讓你的代碼可以在以後對NULL進行測試。通常的範例是,如果一個指針是NULL,那麼你知道它沒有被初始化,也沒有指向任何東西。如果它不是NULL,那麼它可能指向一個有效的對象,你可以使用它。儘管這種範例意味着當它指向的對象被刪除或以其他方式呈現無效時,需要確保將指針設置回NULL。你可能想看看智能指針如何工作,而不是常規的「啞」指針。

2

您對new intint *x = new int;的理解不正確(或者至少,您的措辭不正確)。

new int分配一些內存。它不會「分配內存給指針」,它只是分配內存。它提供了一個指向該內存的指針,這在之前不存在。

int *x;也爲稱爲x的變量分配內存。 x是一個變量,其值是另一個對象的地址。 (與其他類型的變量相反,其值可以是數字或字符串)。

int *x = nullptr;意味着x保存一個特殊的值,稱爲「空指針」,它不表示任何其他對象。

int *x = new int表示x保存由new int分配的內存塊的地址。所以在這一行中有兩個分配:x和由new分配的未命名內存。

在你可以輸出各自分別這些分配的地址。:後者的情況下,e.g

cout << &x << ',' << x << '\n'; 
相關問題