2011-01-06 83 views
0

當我寫這樣的代碼:理解指針C++

Animal *p; 
Animal b; 
p = &b; 

在第一行中,當我建立一個指針。動物的新對象是否被創建,或者只有當你寫第二行時?

謝謝。

+0

只有當你寫的第二條線。 – 2011-01-06 18:18:14

回答

5

在第一行中,創建了一個指針,但它不指向任何東西。在第二行中,創建一個實際的Animal對象。

+0

如果我做一個poiner作爲私人和一個函數內我創建一個實際的對象,並把它放到指針就像我在問題中寫的時我退出函數做新對象終止? – adir 2011-01-06 18:18:06

+1

@adir是當析構函數超出範圍並且指針將失效時調用析構函數。它們被稱爲指針,因爲它們指向內存中的位置,它們不是被創建的實例,而是通過使用new運算符在堆上分配它們,在這種情況下,您必須記得也要刪除它們,否則將會發生內存泄漏! – AJG85 2011-01-06 18:58:49

4

Animal *p;創建一個指針,Animal b;創建一個動物。

1

一個新對象在堆棧上時,就產生該方法時和消失時該方法返回。如果從方法中返回該值並嘗試使用它,將會導致應用程序崩潰,因爲堆棧內存將作爲從該方法返回的一部分被釋放。

9

在聲明指針[和聲明是一個定義],空間僅分配給一個指針,沒有創建Animal對象。

如果您不初始化指針,除了將其指向有效的Animal對象或將其指定給特殊的「空指針值」以指示指針不指向在一個有效的對象。你甚至不能測試它是否實際上指向一個有效的Animal對象。

它始終是最好初始化指針或者爲空或有效的對象,只要你創建他們,所以我會建議之一:

Animal* p = 0; // or = NULL 
Animal u; 
p = &u; 

或更好:

Animal u; 
Animal* p = &u; 
0
// create a pointer to an animal object and initialize it to NULL 
//Animal* p; // Bad! Do not do this 
Animal* pA = NULL; // Much better 

Animal a; // creates an Animal object on the stack (local scope) 

Animal pA = &a; // sets pA to point to the location of a 

現在,當a超出範圍,pA仍將指向該內存位置。如果你嘗試訪問它,壞的事情可能(並且將會)發生。