簡體   English   中英

C ++返回空指針

[英]C++ return null pointer

我在下面有這段代碼,我認為有些事情我不理解。
d_headerWaterHeater類型的指針,是house類的變量。
第2行創建一個指向d_heater對象的指針。 由於兩者都指向同一個對象,因此,如果objd_header被更改,則更改將反映在另一個對象中。 第3行向d_header分配nullptr ,第4行返回obj 第一個問題:因為兩個對象都指向同一個對象,所以obj也不也指向null嗎? 那么返回Null指針有什么意義呢? 第二個問題:在這種情況下nullptr是否與delete相同?
謝謝你的時間。

WaterHeater* house::removeWaterHeater(){ //Line 1
    WaterHeater *obj = d_heater;         //Line 2
    d_heater = nullptr;                  //Line 3
    return obj;                          //Line 4
}

由於兩者都指向同一個對象,因此,如果objd_header被更改,則更改將反映在另一個對象中。

那是不對的。 如果它們指向的內容被更改,則可以通過任一指針看到該更改,但是如果其中一個指針被更改為指向不同的內容,則另一個仍將指向先前的對象。

簡單的例子:

int i = 10;
int j = 20;

int* ptr1 = &i;
int* ptr2 = ptr1;

此時,兩個指針都指向同一個對象i i值可以通過以下方式更改:

  1. 直接給i賦值。

      i = 15; 
  2. 通過為ptr1指向的位置分配一個間接值。

      *ptr1 = 15; 
  3. 通過為ptr2指向的位置分配一個間接值。

      *ptr2 = 15; 

但是,您可以使用以下方法更改ptr1指向的位置:

ptr1 = &j;

現在, ptr1指向jptr2仍然指向i

i所做的任何更改都可以通過ptr2看到,但不能通過ptr1看到。
j所做的任何更改都可以通過ptr1看到,但不能通過ptr2看到。

因為兩個對象都指向同一個對象,所以obj也不也指向null嗎?

答案現在應該清楚了。 obj繼續指向d_header所指向的對象。 它不是NULL。

那么返回Null指針有什么意義呢?

該函數不一定返回NULL指針。 該函數返回d_header所指向的所有內容,然后將其更改為nullptr 如果在調用函數之前d_header曾經為NULL,則它可能是NULL指針。

nullptr在這種情況下是否與delete相同?

不它不是。 有兩種不同的操作。 將指針分配給nullptr並不自動意味着在指針上調用了delete 如果需要釋放指針所指向的內存,則必須調用顯式調用delete

問:“因為兩個對象都指向同一個對象,所以obj也不也指向null嗎?”

不, objd_heater都包含內存中的地址。 更改一個不會更改另一個。 如果您考慮非指針變量,這很容易看出:

int foo = 13;
int bar = foo;
foo = 42;

顯然,我們知道bar仍然保留13 ,而obj仍然保留原始地址。

如果您希望 obj保持與d_heater相同的值, d_heater可以將其作為引用,然后objd_heater是相同的變量,它們不只是共享相同的 我們可以再次查看非指針變量,但是這次讓我們將bar作為參考:

int foo = 13;
int& bar = foo;
foo = 42;

現在, foobar都等於42。如果要使用obj完成相同的操作,請使其成為指針引用:

WaterHeater*& obj = d_heater;

您可以在此處查看更詳細的示例: http : //ideone.com/I8CTba

問:“ nullptr在這種情況下是否與delete相同?”

不,再次d_heater只是一個地址 如果將新值分配給d_heater ,則僅引用內存中的另一個點。 如果通過重新分配d_heater丟失了非常糟糕的動態分配內存的地址,則稱為內存泄漏 為了防止泄漏,您必須始終釋放動態分配的內存,然后再將最后一個地址丟失到動態分配的內存中(對於帶有new分配的內存,請調用delete 。)

也就是說,除非您真的知道自己在做什么,否則最好將動態內存分配的使用留給標准庫。 因此,我強烈建議您考慮使用自動指針 在C ++ 11中,這些是unique_ptrshared_ptr

你混淆兩個指針指向同一個對象和兩個指針是同一對象的思想。 當你寫:

WaterHeater *obj = d_heater;
d_heater = nullptr;

您正在將d_heater的值分配給obj,但它們仍然是單獨的變量。 就像寫:

int x = 7;
int y = x;
x = 8;

y當然仍然是7,因為盡管xy具有相同的值,但它們不是同一對象。

因此d_heaterobj是兩個不同的實體,碰巧具有相同的值,並且對一個實體的賦值不會反映在另一個實體中。 但是, *d_heater*obj 是同一對象 ,如果我們將它們分配給其中一個,它將反映在另一個對象中。 這就是您感到困惑的地方。

要回答第二個問題, nullptr永遠與delete相同。 delete不會更改指針的值:它會釋放/解構指針所指向的對象。 為指針分配nullptrNULL不會影響它指向的對象:它只是重新分配了指針,使其不指向對象。

obj不是指向null 正如您提到的,它只是指向null指針( d_header )。 而且它與delete ,您只是使其指向無內容(如空)。

nullptr沒有指向NULL指針。 檢查以供參考。

如果您這樣做:

WaterHeater* house::removeWaterHeater(){ //Line 1
    WaterHeater *obj = d_heater;         //Line 2
    d_heater = NULL;                     //Line 3
    return obj;                          //Line 4
}

現在, obj也指向NULL
而且nullptr並不意味着delete

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM