2017-07-25 102 views
0

所以基本上我想這個代碼了,編譯在CL(Visual Studio C++編譯器),並保持打印0.不應該y等於nullptr?兩個指針沒有正確刪除

#include <iostream> 
#include <string> 
using namespace std; 
int main() { 
    int* x; 
    x = new int(5); 
    int* y; 
     y = x; 
    delete x; 
    x = nullptr; 
    cout <<(y==nullptr)<< endl; 
    return 0; 
} 
+3

你有兩個不同的變量,每個包含*副本*對方(最初)的。這就像有例如'int x = 5; int y = x; x = 0;'然後想知道爲什麼'y'不等於'0'? –

+3

我不明白downvoting。這是一個可編輯的例子,寫得很好。請不要以顯而易見的理由倒下。 – Bathsheba

+0

如何在刪除之前檢查y是否指向損壞的內存? – JukesOnYou

回答

5

沒有,設置xnullptr不設置ynullptr了。

yint*不是參考int*

所以,y == nullptr必然是 false


對於酒吧測驗:x不能nullptr因爲如果分配失敗則std::bad_alloc會被拋出。它有可能爲ynullptr了你寫x = new(std::nothrow) int(5);

+2

*「酒吧測驗」* - 不知道是否錯字或優秀的雙關語。 – StoryTeller

0

指針仍然正常變量,以右和左值。

它們只有在它們的正確值是可以由用戶管理的存儲位置的地址的事實中才是特殊的。

在你的情況下,兩個xy在棧上的某個地方分配。你在哪裏做y=x你設置y的值爲相同的值x,但後來,當你做x=nullptr時,你只改變了值x而不是值y

另外,要注意這樣的事實,而在此之前delete xxy是指一個有效的地址,之後x正確設置爲nullptr,而y保留現在無效的內存地址。這是一個pointer aliasing的情況,這可能會導致幾個問題,首先是無效的內存訪問錯誤。

0

讓我們一行一行:

x = new int(5); //allocate an integer, set it to 5 and return a pointer to it (x will not nullptr). 
int* y; //allocate local storage to another pointer. 
y = x; //copy the (not nullptr) value of x into y. 
delete x; //de-allocate the space previously allocated. 
//At this point the value of x is unchanged and y is equal to it. 
//De-referencing x (*x) however is undefined because it was deallocated. 
x = nullptr; //Set x to nullptr. Has no effect on y. 
cout <<(y==nullptr)<< endl; //y still equals the (now invalid) value allocated above. 

分配給另一個變量的變量是一次性的事情。之後,更改爲一個不會反映在另一個(雖然更改'通過'可能會影響另一個)。

0

實際上這裏發生了什麼:

  1. 您聲明int類型爲x的新指針。
  2. 您將x指向新的int。
  3. 你聲明一個新的指針爲y。
  4. 您可以將x的值賦給y的值,即y現在也指向新的int值。
  5. 刪除x。
  6. 您打印條件的操作,檢查閹y等於nullptr,哪個是假的爲y仍然指向int和有一定價值的結果。因此,結果打印爲0,即爲假。
  7. 您將返回0! :P
2

甲指針沒有 「已刪除」。刪除操作釋放指針指向的內存塊,並保持該指針不變。它不會設置爲nullptr,並且不指向「無」(順便說一下,您明確地清除它)。

和指針用作普通變量,保持值(地址)。更改變量的值不會影響另一個(除走樣的情況下,卻是另一回事。)

+1

*「,並保持這個指針不變。」* - 這是受解釋。操作之後,指針值正式無效。這就打開了一個完整的實施定義的詭計,這個標準完全可以。 – StoryTeller

+0

@StoryTeller:我根本無法追隨你。如果在刪除指針前保存0x43FF4500,刪除後仍然保存0x43FF4500,句號。你正在犯同樣的錯誤,認爲指針變量和它曾經指向的內存塊之間存在伏都教關係。例如,將「正式無效」指針值複製到另一個指針是無害的。 –

+1

這很豐富。我建議你實際上閱讀了關於addrees無效化的內容,就實現定義的行爲而言它意味着什麼,以及在刪除表達式之後立即假定「x == y」不是標準強制要求的。 – StoryTeller