[英]Why do I have to call “delete” twice when I have each two pointers at same memory?
我通過使用new
將堆內存分配給指針變量'k'
,並將其復制到另一個指針變量'd'
。
在那種情況下,我認為這兩個變量指向同一個內存,因此"delete"
僅一個變量就需要內存。 無論'k'
或'd'
。 但是,當我delete k
時, 'k'
和'd'
指向內存。
所以我確實delete d
,並且出現了Abort trap 6 error
。
這是我的測試代碼。
int* k;
k = new int(5);
int* d = k;
cout<<"d's : "<<d<<endl;
cout<<"k's : "<<k<<endl;
delete d;
cout<<"d's : "<<d<<endl;
cout<<"k's : "<<k<<endl;
delete k;
cout<<"d's : "<<d<<endl;
cout<<"k's : "<<k<<endl;
結果是
d:0x7fbb56c02ae0
k的:0x7fbb56c02ae0
d:0x7fbb56c02ae0
k的:0x7fbb56c02ae0中止陷阱:6
我希望在delete d
之后訪問'k'
和'd'
導致segment error
,因為我刪除了內存!
我想念的是什么,有人可以幫我嗎?
但是,當我
delete k
時,k
和d
指向內存。
在某些指針上調用operator delete
將要求操作系統釋放與此指針關聯的內存,但不會更改指針本身的值。 k
和d
繼續指向內存中相同的位置,同時釋放該位置。
這就是為什么人們有時在delete
-ing它之后delete
指針設置為nullptr
的原因。 就您而言,這將使您擺脫不確定的行為:
delete d;
d = nullptr;
k = nullptr; // Both must be re-assigned
delete k; // Ok, delete on a nullptr is a no-op
delete
某些內容時,並沒有破壞內存,只是將其標記為未使用。 (您也可以運行析構函數中包含的清除代碼,但這是另一回事。)內存本身(即物理位和字節)與以前一樣保留在原位。
這樣,當您delete
指針時,指針在發生這種情況后仍然保持指向物理內存中相同的字節, 但是您不再被允許使用它們 。 如果這樣做,則允許發生任何事情。 這甚至適用於指針本身:禁止再delete
指向delete
d內存的任何指針,它立即無效。
如果你使用一個指針它已經后delete
d,它可能會出現正常工作。 否則您可能會崩潰。 或者,您可以訪問使用相同的物理內存字節創建的其他一些內存對象。 你根本不知道會發生什么 。
因此,您的最初想法是正確的:只有兩個指針之一恰好需要delete
,事實發生后,不得觸摸兩個指針中的另一個:
int* k;
k = new int(5);
int* d = k;
cout<<"d's : "<<d<<endl;
cout<<"k's : "<<k<<endl;
delete d;
// cout<<"d's : "<<d<<endl; //Undefined behavior, the pointer is invalid now
// cout<<"k's : "<<k<<endl; //Undefined behavior, k is invalid as well
// delete k; //Undefined behavior, k is invalid
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.