#include "A.h"
int main (int argc, char*argv[]){
A * p_a1 = new A();
A * p_a2 = p_a1;
delete p_a1;
p_a1 = 0;
delete p_a2 <br>
這個 A 是某個類的代碼會導致記憶體管理問題嗎?
我的想法:
第一行將創建一個指向 A 的指標。我不確定這是否也會為 A 分配記憶體,還是只是分配一個地址?第二個指標 p_a2 指向確切位置。
delete p_a1 將洗掉分配的記憶體,其中可能沒有任何 p_a1=0,使其為空。洗掉 p_a2。然后我們洗掉空指標,這可能不會影響
這是否會導致任何記憶體泄漏或問題?
uj5u.com熱心網友回復:
兩次洗掉同一個物件絕對是記憶體管理問題。delete p_a1;確實洗掉了指向的物件p_a1,然后delete p_a2嘗試洗掉完全相同的物件。
請記住:您不是洗掉指標,而是洗掉它們指向的物件。
Rawnew始終是一種代碼異味和潛在的錯誤來源。您的代碼應如下所示:
#include "A.h"
int main (int argc, char*argv[]){
A a;
}
坦率地說,鑒于您的問題恕我直言,人們要么只能觸及皮毛,要么寫一篇長篇文章來解釋重要的基礎知識。我選擇了第一個,并為您推薦一本書以了解更多詳細資訊:The Definitive C Book Guide and List
uj5u.com熱心網友回復:
您的問題是p_a1和p_a2是獨立的指標,它們一次恰好指向同一個物件。
后
delete p_a1;
p_a1 = 0;
從一個p_a1角度來看一切都很好:它指向的物件已被洗掉,并且指標本身已收到一個nullptr值,因此現在可以安全地delete p_a1再次執行。
但是p_a2沒有被改變,現在指向一個已經到了生命盡頭的物件。所以它變成了一個懸空指標,取消參考或洗掉它會呼叫 UB。
如果你想p_a2成為等同于p_a1你應該讓一個參考:
A* &p_a2 = p_a1;
現在,經過p_a1 = 0,p_a2是一個空指標參考,它可以安全地洗掉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/370430.html
