簡體   English   中英

如果引用仍然存在,是否不會在析構函數中刪除指針會導致內存泄漏?

[英]Will not deleting a pointer in destructor cause memory leak if reference should stick around?

我不知道如何簡化我的問題,但是說我有這個意思:

class Curve;

class Node {
    Curve *curve;
public:
    Node(Curve *curve);
    ~Node();
}

class Curve {
    LinkedList<Node> nodes;
public:
    Curve(); ~Curve();
}

可以不刪除析構函數~Node曲線的指針嗎? 即會導致內存泄漏嗎? 還是我應該刪除它? 如果刪除它,會破壞曲線嗎?

編輯:曲線最終將被刪除。

編輯2:實施。

說我實現以下代碼:

int main() {
    Curve *curve = new Curve();
    Node *node = new Node(curve);
    delete node; delete curve;
    return 0;
}

我是否仍需要在節點的析構函數中調用delete curve

這與內存碎片或內存泄漏無關。

這是關於:

  • 所有權:
    • 誰擁有資源? main (與Node共享)或Nodemain轉讓所有權)? 您需要通過使用智能指針或通過文檔以某種方式使其變得清晰。
  • 正確性:
    • 這些東西中只有一個 (擁有所有權的東西)應該刪除。 您不能兩次刪除事物。

如其他答案所述,這與所有權有關。 在您的特定示例中,最好不要在Node類的析構函數中刪除Curve *,因為您可以在main函數中管理Curve實例的壽命。 在實際代碼中,管理原始指針可能非常困難,並且會導致令人討厭的錯誤。 由於您將問題標記為C ++,因此應使用標准庫的智能指針,並將Curve *替換為std :: shared_ptr。 如果您改變主意並讓Node獨自負責管理Curve實例,則最好使用std :: unique_ptr而不是原始指針。

暫無
暫無

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

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