簡體   English   中英

這是內存泄漏嗎?

[英]Is this a memory leak?

char *pointer1;
char *pointer2;

pointer1 = new char[256];
pointer2 = pointer1;

delete [] pointer1;

換句話說,我也必須delete [] pointer2嗎?

謝謝!

不,該代碼很好,不會泄漏內存。

您只需使用一次delete [],因為即使有兩個指向同一內存的指針,也只使用了一個new來分配一個內存區域。

一個簡單的規則:您需要的deletenew的數量一樣多。 更好的是,使用智能指針或容器之類的東西來為您照顧好它。

還有一點要pointer2是:一旦在pointer1上調用deletepointer2就會變成“懸空指針”。

這不是泄漏,而是自找麻煩。 刪除pointer1 pointer2便會指向誰知道什么。 這就是所謂的“懸空指針”。 最好的情況下使用它可能導致段錯誤,最壞的情況下使用它可能導致在分配了相同位置的任何事物中進行神秘的數據處理。

盡管它不會泄漏內存,但是如果您想明確一點,則應將point1point2都設置為NULL(並以這種方式進行初始化)。

另外,考慮使用Boost庫中的boost::shared_ptr<> 這是切面包以來最偉大的事情。

typedef boost::shared_ptr<TypeX> StrRef;

foo() {
  StrRef pointer1(new TypeX);

  while(something) {
    StrRef pointer2 = pointer1;
    // do stuff
  }

 return;
}

當數據的最后一個指針超出范圍時,將刪除該數據( TypeX )。 如果不需要引用計數,則可以使用內置的auto_ptr<>類型執行類似的操作:

typedef auto_ptr<TypeX> StrRef;

foo() {
  StrRef pointer1(new TypeX);

  while(something) {
    TypeX * pointer2 = pointer1.get();
    subroutine(pointer2);
    if (condition) return;
  }

 return;
}

每當pointer1超出范圍時,它將刪除數據。 這樣做的好處是您不必記住在底部的return語句之前放置一個delete,並且如果pointer1由於任何其他原因超出范圍(例如,從循環中間返回,或者subroutine()拋出)例外,那么數據仍將被正確地重新分配。

我尚未測試此代碼,因此您必須自己檢查文檔中的auto_ptr<>boost::shared_ptr<>

我強烈建議盡可能使用Boost庫。 它是由pro編寫的,基本上是C ++擴展的過渡區域。

delete刪除new分配的內存。 由於您只有一個new ,因此只需delete一個。

僅在使用了“新建”后才使用“刪除”

好的做法是將指針2設置為NULL,但是如果不這樣做,則不會發生內存泄漏

不,您不必刪除[]指針2,因為您尚未為其分配內存!

聲明pointer2 = pointer1使pointer2指向相同的內存地址pointer1 ,因為它沒有分配任何額外的內存。

每個new都應該有一個,只有一個與之匹配的delete 如果刪除了另一個指針,則會違反該規則。

您在這里所做的只是告訴new char[256]分配的內存塊將同時由指針pointer1pointer2指向。

如果您編寫delete[] pointer2; ,將會導致內存泄漏delete[] pointer2; 聲明之后。

這是您的思維鴻溝:您不刪除指針,而是刪除內存。 您只需使用指針來標識要釋放的內存塊。 由於兩個變量指向同一內存,因此刪除一個變量與刪除另一個變量完全相同。 換句話說,刪除兩者與刪除其中之一相同,這顯然是錯誤的。

暫無
暫無

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

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