簡體   English   中英

交換指針后刪除動態分配的 memory

[英]Delete dynamically allocated memory after swapping its pointer

我對 C++ 比較陌生,我想同時了解 memory 管理和指針。

假設我有下面的代碼

int* p1;
int* p2;
int* p3 = new int[some size];

p1 = p3;

std::swap(p1,p2);

如何正確刪除動態分配的 memory? delete[] p3就夠了嗎? 之后我也應該刪除p2嗎?

當您執行以下操作時,口語中會出現一些模糊:

delete x;

我們說“我們刪除x ”。 嚴格來說這是錯誤的,因為刪除的是x指向的 object 。

每個通過new / new[]分配的 object 必須通過一次調用delete / delete[]來銷毀。 無論您是否有兩個或多個指向同一個 object 的指針都不會改變這一點。

int* p1 = nullptr;
int* p2 = nullptr;
int* p3 = new int[some size];      // p3 points to the array

p1 = p3;                           // p1 points to the same array

std::swap(p1,p2);                  // now p1 == nullptr, p2 points to the array

請注意,您的示例中的指針未初始化。 讀取它們的值會導致未定義的行為。 因為這不是問題的症結所在,所以我通過初始化它們來避免這個問題。

通過new []創建了一個數組,您必須通過delete []刪除該數組。 你不能刪除它兩次。 所以要么調用delete[] p3; delete[] p2; ,但不是兩者兼而有之。

PS:評論已經提到智能指針,我也建議你閱讀它們。 現在你不應該使用原始的擁有指針。 擁有指針是您需要調用delete的指針,它“擁有”指向 object 的指針。 原始指針只能用於“觀察”,即您永遠不必擔心在原始指針上調用delete (或delete[] )。 當然,您仍然需要注意指向 object 是否仍然存在,但這並不特定於動態分配:

 int* p;
 { 
     int x = 42;
     p = &x;         // p points to x;
 }                   // x goes out of scope
 // here p is not a valid pointer anymore

要了解這里發生了什么,添加一些調試語句會有所幫助,即:

std::cout << p1 << " " << p2 << " " << p3 << "\n";

跟蹤將導致 output 如下:

0 0 0x15e7eb0
0x15e7eb0 0 0x15e7eb0
0 0x15e7eb0 0x15e7eb0

(請注意,我將 p1 和 p1 初始化為nullptr

p3 最初指向一些 memory。 在分配p1 = p3之后,p1 現在指向與 p3 相同的 memory 地址。 當您交換指針時,現在是 p2 指向與 p3 相同的 memory 地址。

這里有幾點需要注意:

  • 必須delete[]與相應的new[]配對(不要用new[]調用delete等等)
  • 對已刪除的 object 調用 delete 是未定義的行為
  • 在 null 指針上調用 delete 是完全安全的

如您所見,處理原始指針和 memory 分配很容易導致陷阱。 通常建議使用智能指針,或者如果您有非擁有指針,則使用諸如observer_ptr之類的抽象來清楚地指示代碼中指針的用途。

暫無
暫無

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

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