[英]C++ return null pointer
我在下面有這段代碼,我認為有些事情我不理解。
d_header
是WaterHeater
類型的指針,是house
類的變量。
第2行創建一個指向d_heater
對象的指針。 由於兩者都指向同一個對象,因此,如果obj
或d_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
}
由於兩者都指向同一個對象,因此,如果
obj
或d_header
被更改,則更改將反映在另一個對象中。
那是不對的。 如果它們指向的內容被更改,則可以通過任一指針看到該更改,但是如果其中一個指針被更改為指向不同的內容,則另一個仍將指向先前的對象。
簡單的例子:
int i = 10;
int j = 20;
int* ptr1 = &i;
int* ptr2 = ptr1;
此時,兩個指針都指向同一個對象i
。 i
值可以通過以下方式更改:
直接給i
賦值。
i = 15;
通過為ptr1
指向的位置分配一個間接值。
*ptr1 = 15;
通過為ptr2
指向的位置分配一個間接值。
*ptr2 = 15;
但是,您可以使用以下方法更改ptr1
指向的位置:
ptr1 = &j;
現在, ptr1
指向j
而ptr2
仍然指向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
和d_heater
都包含內存中的地址。 更改一個不會更改另一個。 如果您考慮非指針變量,這很容易看出:
int foo = 13;
int bar = foo;
foo = 42;
顯然,我們知道bar
仍然保留13
,而obj
仍然保留原始地址。
如果您希望 obj
保持與d_heater
相同的值, d_heater
可以將其作為引用,然后obj
和d_heater
是相同的變量,它們不只是共享相同的值 。 我們可以再次查看非指針變量,但是這次讓我們將bar
作為參考:
int foo = 13;
int& bar = foo;
foo = 42;
現在, foo
和bar
都等於42。如果要使用obj
完成相同的操作,請使其成為指針引用:
WaterHeater*& obj = d_heater;
您可以在此處查看更詳細的示例: http : //ideone.com/I8CTba
nullptr
在這種情況下是否與delete
相同?” 不,再次d_heater
只是一個地址 。 如果將新值分配給d_heater
,則僅引用內存中的另一個點。 如果通過重新分配d_heater
丟失了非常糟糕的動態分配內存的地址,則稱為內存泄漏 。 為了防止泄漏,您必須始終釋放動態分配的內存,然后再將最后一個地址丟失到動態分配的內存中(對於帶有new
分配的內存,請調用delete
。)
也就是說,除非您真的知道自己在做什么,否則最好將動態內存分配的使用留給標准庫。 因此,我強烈建議您考慮使用自動指針 。 在C ++ 11中,這些是unique_ptr
和shared_ptr
。
你混淆兩個指針指向同一個對象和兩個指針是同一對象的思想。 當你寫:
WaterHeater *obj = d_heater;
d_heater = nullptr;
您正在將d_heater
的值分配給obj,但它們仍然是單獨的變量。 就像寫:
int x = 7;
int y = x;
x = 8;
y
當然仍然是7,因為盡管x
和y
具有相同的值,但它們不是同一對象。
因此d_heater
和obj
是兩個不同的實體,碰巧具有相同的值,並且對一個實體的賦值不會反映在另一個實體中。 但是, *d_heater
和*obj
是同一對象 ,如果我們將它們分配給其中一個,它將反映在另一個對象中。 這就是您感到困惑的地方。
要回答第二個問題, nullptr
永遠與delete
相同。 delete
不會更改指針的值:它會釋放/解構指針所指向的對象。 為指針分配nullptr
或NULL
不會影響它指向的對象:它只是重新分配了指針,使其不指向對象。
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.