2013-02-27 39 views
0

我只是在試驗數據結構的基礎知識,並且對某些東西感到好奇。正如你可以在我的代碼中看到的那樣,在弄清p指針之後,我決定刪除它。我刪除了P指針,我認爲它也會delete p->proximo('proximo'是葡萄牙語'next'),但它並沒有明顯的表現。 Acesso 3(Access 3 in Portuguese)的結果爲0 22.在C++中,在指向某個類的指針被破壞之後,我是否可以使用新函數重新使用指針

所以首先,如果我刪除了指針,爲什麼我仍然可以連接到指針p->proximo?好吧,但因爲它沒有,這是一件好事,這意味着我現在可以刪除東西。於是我決定把這個22的值交給第一個點頭。所以我不會破壞列表中的節點。正如你可以在第28行中看到的那樣,我嘗試使用p = p->proximo。但它不起作用。當然它沒有。我刪除了指針。有沒有什麼辦法可以重新創建第一個指針,這樣我就可以修復這個列表,所以第一個節點的值是22?我試過

p = new IntNode(); 
p = p->proximo; 

但它也失敗了。可能是因爲現有的下一個節點可能?

我欣賞任何你非常多的幫助

代碼:

#include <iostream> 
using namespace std; 

class IntNode{ 
public: 
    IntNode(){ 
    proximo = 0; 
    } 
    IntNode(int file, IntNode *next = 0) 
    { 
    number = file; 
    proximo = next; 
    } 
    int number; 
    IntNode *proximo; 
}; 

int main() 
{ 
    IntNode *p = new IntNode(15); 
    cout << "Acesso 1: " << p->number; 
    p->proximo = new IntNode(22); 
    cout << endl << "Acesso 2: " << p->number << " " << p->proximo->number; 
    delete p; 
    cout << endl << "Acesso 3: " << p->number << "  " << p->proximo->number << endl; 
    p = new IntNode(5); 
    cout << endl << "Acesso 4: " << p->number << "  " << p->proximo->number << endl; 
    p = p->proximo; 
    cout << endl << "Acesso 5: " << p->number << "  " << p->proximo->number << endl; 
    delete p->proximo; 
    cout << endl << "Acesso 6: " << p->number << "  " << p->proximo->number << endl; 
    return 0; 
} 
+0

您需要閱讀[析構函數](http://en.cppreference.com/w/cpp/language/destructor)。 – 2013-02-27 09:21:07

+1

使用刪除的指針就像[保持酒店房間的鑰匙](http://stackoverflow.com/a/6445794/597607)。 – 2013-02-27 09:26:12

+0

你可以使用'valgrind'這樣的工具來檢測這個。 – 2013-02-27 10:34:30

回答

4

爲什麼我還可以連接至P> PROXIMO指針?

它是未定義的行爲。只是發生在delete之後的任何p指向的地方仍然存在(請參閱@ BoPersson評論中的hotel room analogy)。但你不能依賴這一點。如果你想增加獲得運行時錯誤的機會,還是給自己檢查的p有效性的能力,它(在C++ 11 nullptr)設置爲NULL或:

delete p; 
p = nullptr; 

下一個時,你這樣做:

p = new IntNode(5); 

p->proximo設置爲空。這就是你已經編寫你自己,所以應該不會令你感到驚訝:

IntNode(int file, IntNode *next = 0) 
{ 
    number = file; 
    proximo = next; 
} 

最後,回答標題中的問題,

在C++中,指針的破壞到後類,我可以重新利用指針使用新功能

是的,你可以。

delete p; 
p = someOtherPointerToIntNode; 
+0

juanchopanza,所以p,即使刪除p仍然有相同的地址? – 2013-02-27 09:22:41

+0

@VictorChavauty沒錯。你只要刪除那個東西指向的東西,你根本不會修改指針本身。 – juanchopanza 2013-02-27 09:23:20

+0

謝謝!我現在明白了:D – 2013-02-27 09:53:27

1

刪除將釋放內存。如果你跳轉到這個存儲位置,數據將仍然存在 - 除非它被覆蓋。刪除後使用它被認爲是不好的做法,因爲它增加了難以發現錯誤的機會。

+1

使用free()或delete()釋放內存後,永遠不應該訪問內存。行爲是未定義的。而分段錯誤的可能性非常高。 – Tuxdude 2013-02-27 09:23:25

相關問題