簡體   English   中英

在c ++中刪除void *指針

[英]Delete void* pointer in c++

我正在閱讀c ++中的思考,第13章:動態對象創建。 在本章中,Eckel談論刪除void *可能是一個錯誤。 以下段落讓我感到困惑。

另一個內存泄漏問題與確保為容器中保存的每個對象指針實際調用delete有關。 容器不能“擁有”指針,因為它將其保存為void *,因此無法執行正確的清理。 用戶必須負責清理對象。 如果將指向堆棧上創建的對象和堆上創建的對象添加到同一容器的指針,則會產生嚴重問題,因為delete-expression對於尚未在堆上分配的指針是不安全的。

任何人都可以解釋為什么“將指向堆棧上創建的對象和堆上創建的對象添加到同一容器”的更多詳細信息會產生嚴重問題?

為了更清楚地解決問題,我添加了相關的代碼段。

class Stack {
  struct Link {
    void* data;
    Link* next;
    void initialize(void* dat, Link* nxt);
  }* head;
public:
  void initialize();
  void push(void* dat);
  void* peek();
  void* pop();
  void cleanup();
};

作為一般規則,堆棧上的對象不需要被刪除,堆上的對象需要。 如果將它們放在同一個容器中,如何跟蹤要刪除的容器? 最好有兩個容器,一個用於堆棧上的對象(不需要刪除的對象),另一個用於堆上的對象(需要刪除的對象)。

這段確實有點模糊。 在我看來,它混合了兩個不同的問題,導致混亂。

  1. 為了正確刪除對象,編譯器必須知道其類型。 對於void*類型是未知的(這正是使用void* - 隱藏實際類型的點)。 因此,如果不轉換為正確的實際類型,則無法對此類對象執行刪除操作。
  2. 通常使用void*意味着指向對象的所有權通過設計屬於某個外部實體,而不屬於包含指針的實體。 在實體內部,指針是不透明的,並且用作外部對象的處理程序,就實體而言,外部對象是一個黑盒子。 Stack類必須非常清楚責任划分,並且不得試圖破壞void*對象,因為它既不知道它的生命周期(例如導致嘗試釋放堆棧變量),也不應該知道應該是什么操作。在破壞時完成(導致功能不正確)。

暫無
暫無

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

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