簡體   English   中英

C ++刪除指向指針的指針

[英]C++ deleting a pointer to a pointer

所以我有一個指針數組的指針。 如果我這樣刪除它:

delete [] PointerToPointers;

那會刪除所有指向的指針嗎? 如果沒有,我是否必須遍歷所有指針並刪除它們,或者有更簡單的方法嗎? 我的google-fu似乎沒有給我任何關於這個問題的好答案。

(是的,我知道我需要使用一個向量。這是學校中“趕上C ++”類型作業之一。)

是的,你必須遍歷指針,單獨刪除。

原因:如果其他代碼有指向數組中對象的指針怎么辦? C ++編譯器不知道這是不是真的,所以你必須明確。

對於“更簡單的方法”,有兩個建議:(1)為此目的制作一個子程序,這樣至少你不必多次編寫代碼。 (2)使用“智能指針”設計范例,其中您使用引用計數器保存對象數組,然后在任何代碼不再引用對象時刪除對象。

我同意Jason Cohen,雖然我們可以更清楚地了解需要通過循環刪除指針的原因。 對於每個“新”或動態存儲器分配,需要“刪除”存儲器解除分配。 有時候“刪除”可以被隱藏,就像智能​​指針一樣,但它仍然存在。

int main()
{
  int *pI = new int;
  int *pArr = new int[10];

到目前為止,我們在代碼中分配了兩個動態內存塊。 第一個是一般的int,第二個是一個int數組。

  delete pI;
  delete [] pArr;

這些刪除語句清除了“新”分配的內存

  int ppArr = new int *[10];

  for( int indx = 0; indx < 10; ++indx )
  {
    ppArr[indx] = new int;
  }

這段代碼正在執行以前的兩個分配。 首先,我們在動態數組中為int創建空間。 然后我們需要遍歷並為數組中的每個點分配一個int。

  for( int indx = 0; indx < 10; ++indx )
  {
    delete ppArr[indx];
  }
  delete [] ppArr;

請注意我分配此內存的順序,然后按相反的順序取消分配。 這是因為如果我們要刪除[] ppArr; 首先,我們將失去告訴我們其他指針是什么的數組。 該塊或內存將被返回給系統,因此無法再可靠地讀取。

  int a=0;
  int b=1;
  int c=2;

  ppArr = new int *[3];

  ppArr[0] = &a;
  ppArr[1] = &b;
  ppArr[2] = &c;

我認為也應該提到這一點。 僅僅因為你使用指針並不意味着那些指針所指向的內存是動態分配的。 也就是說,僅僅因為你有一個指針並不意味着它必然需要被刪除。 我在這里創建的數組是動態分配的,但是指針指向int的本地實例當我們刪除它時,我們只需要刪除數組。

  delete [] ppArr;

  return 0;

}

最后,動態分配的內存可能很棘手,無論如何你可以安全地將其包裝起來,就像在智能指針中或使用stl容器而不是你自己可以讓你的生活更愉快。

請參閱boost指針容器,查找為您自動刪除包含指針的容器,同時保持語法非常接近普通STL容器。

讓我們看一個(偽編碼)現實世界的例子。想象你有一個這樣的類:

class Street
{
    public:
        Street();
        ~Street();
    private:
        int HouseNumbers_[];
}

typedef *Street StreetSign;

如果您有一系列街道標志,並且刪除了街道標志數組,那並不意味着您會自動刪除這些街道標志。 他們仍然在那里,磚頭和灰漿,他們只是沒有那些跡象指向他們了。 您已經擺脫了街道指針的特定實例。

指針數組(概念上)有點像整數數組,它是表示各種對象的內存位置的數字數組。 它本身不是對象。

如果你刪除[]指針數組,你所做的就是刪除一個整數數組。

指針幾乎只是內存引用而不是漂亮的小自清潔.net對象。 為每個類創建適當的析構函數將使刪除比整個代碼中的大量循環更清晰。

我覺得你恐怕不得不徘徊。

我不知道為什么這個回答如此令人困惑。

如果刪除指針數組,則將釋放用於通常整數的數組的內存。
指向對象的指針是包含地址的整數。

你刪除了一堆地址,但沒有刪除任何對象。

delete不關心內存空間的內容,它調用析構函數並將mem標記為free。

它並不關心它只是刪除了一堆對象的地址,它只是看到了int。

這就是為什么你必須首先循環通過陣列! 並在每個元素上調用delete,然后您可以刪除數組本身的存儲。

好吧,現在我的回答有點長了......奇怪......;)

編輯:傑森的答案沒有錯,它只是沒有碰到現場。 c(++)中的編譯器和其他任何東西都不關心你刪除別處指向的東西。 你可以做到。 嘗試使用已刪除對象的其他程序部分將對您進行分段。 但沒有人會阻礙你。 當在其他地方引用對象時,破壞指向對象的指針數組也不是問題。

暫無
暫無

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

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