[英]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
等等)如您所見,處理原始指針和 memory 分配很容易導致陷阱。 通常建議使用智能指針,或者如果您有非擁有指針,則使用諸如observer_ptr
之類的抽象來清楚地指示代碼中指針的用途。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.