簡體   English   中英

什么時候需要刪除指針,什么時候需要將它們設置為 0?

[英]When do I need to delete pointers, and when do I need to set them to 0?

我是一名 CS 學生,正在學習 C++。

這是一個普遍的問題,但我正在使用的特定示例是創建一個鏈表,該鏈表將具有存儲字符串指針的節點。

class LinkNode {
public:
    friend class Stack;
    LinkNode* next;
    std::string* data;
    LinkNode(std::string* data, LinkNode* next) :data(data), next(next) { ; }
}

如果我使用指針,那么我不應該有一個析構函數在nextdata上調用delete嗎?

~LinkNode() {
    delete this->data;
    delete this->next;
}

我的教材中使用的代碼以及互聯網上的示例都忽略了包含這一點(即使我們確實在其他上下文中使用了析構函數)。 我試圖理解為什么在這種情況下不需要這樣做。

而且,相當相關:如果我使用指針來刪除某些東西,我是否必須將指針設置為 null?

我經常看到人們這樣寫刪除:

delete ptr;
ptr = 0;

據我了解,將其設置為 0 的目的只是為了防止它被意外使用,因為delete后它現在指向一個無效的 memory 地址。

因此,如果我在 function 的末尾調用delete ,其中指針將掉出 scope 無論如何,就像在彈出 function 或析構函數中一樣,可以刪除該行嗎? 人們只是出於習慣而包含它嗎?

  • delete指向有效對象/變量的指針以銷毀它們並釋放空間。
  • 將它們設置為NULLnullptr0 (完全相同),以便您可以將它們識別為未使用。

你看,如果你只是delete object,指針本身不會改變,所以現在它指向了memory的無效空間。 如果您再也不會使用該指針,那么這沒什么大不了的,否則可能會成問題。

因此,將其設置為null允許您對指針執行檢查並確定您的指針是否正在使用。


此外,作為您的第一個問題,正如評論中指出的那樣,您必須在使用new創建的指針上調用delete

  • 因此,假設您的示例的data指針指向在列表之外創建的字符串(因此它的行為類似於引用列表)。 在這種情況下,該指針不負責管理其內容並且不應被刪除。
  • 但是,例如,如果每次添加一個新節點時,都執行data = new string("whatever"); ,那么是的,你應該在析構函數中刪除它們。

暫無
暫無

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

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