簡體   English   中英

當兩個指針都位於同一內存時,為什么必須兩次調用“刪除”?

[英]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時, kd指向內存。

在某些指針上調用operator delete將要求操作系統釋放與此指針關聯的內存,但不會更改指針本身的值。 kd繼續指向內存中相同的位置,同時釋放該位置。

這就是為什么人們有時在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.

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