簡體   English   中英

當2個指針指向同一區域並且其中1個被釋放時會發生什么?

[英]What happens when 2 pointers point to same area and 1 of them is freed?

char *oldPointer, *newPointer;

oldPointer = (char*)malloc(1000);
newPointer = (char*)realloc(oldPointer, 2000)

現在可以使用oldPointer嗎?

現在發生了什么?

oldPointer = newPointer;

如果free(newPointer)會發生什么?

當2個指針指向同一區域並且其中1個被釋放時會發生什么?

oldPointer = (char*)malloc(1000);
newPointer = (char*)realloc(oldPointer, 2000)

oldPointer和newPointer 可能不指向同一區域。 這就是realloc()作用。 如果內存管理器決定這樣做,新指針可能會有所不同(例如,如果舊區域沒有足夠的空間來覆蓋新的所需空間)。 假設它們指向同一區域會導致未定義的行為(UB - 可能與否可能無法正常工作,從而導致調試困難)。

其中一個被釋放

oldPointer = (char*)malloc(1000);
newPointer = (char*)realloc(oldPointer, 2000)

realloc之后你不能使用oldPointer 只存在newPointer 如果您釋放oldPointer並且地址已更改,則UB(可能崩潰)。 如果你釋放oldPointer並且它與newPointer地址相同,那么這與釋放newPointer相同,當然。

無論如何,規則很簡單:在oldPointer之后不要使用oldPointer。 除非

oldPointer = malloc(1000);
oldPointer = realloc(oldPointer, 2000);
^^^

你使用相同的指針。 但是不建議好像realloc失敗你沒有先前分配的地址的痕跡(除非你保存它); 這是一個泄漏。

並且不要投射malloc / realloc。

在檢查realloc()之后發生的事情之前,您無法安全地使用任何一個指針。

可能性1:

realloc失敗,那么newpointer將為NULL並且無法使用,但oldPointer可以。

可能性2:

realloc成功了沒有必要重新定位舊的malloc內存。 在這種情況下,您可以使用兩個指針。 (它們具有相同的地址值)

可能性3:

realloc成功但必須在不同的地方分配內存並釋放舊的內存塊 現在oldPointer仍將指向舊的內存地址,該地址不再有效。 這被稱為懸空指針。

但是,newPointer有效且可以使用。

現在可以使用oldPointer嗎?

當你說“被使用”時,我認為你的意思是“指針可以被解除引用 ”。 換句話說 - 可以做*oldPointeroldPointer[200]或類似的東西。

答案是:它取決於newPointer的值。

除非發生分配錯誤(例如內存不足),否則函數realloc將在重新分配后返回指向內存的指針。 如果發生錯誤, realloc將返回NULL。

因此,使用realloc的正確方法是將返回值保存在另一個指針中,然后檢查NULL。 喜歡

oldPointer = (char*)malloc(1000);                // BTW: dont use cast
newPointer = (char*)realloc(oldPointer, 2000);   // BTW: dont use cast
if (newPointer == NULL)
{
    // realloc failed....

    // the value of oldPointer is still valid

    // It is ok to dereference oldPointer, e.g. using oldPointer[10]

    // Here you will normally have some error handling
}
else
{
    // realloc success

    // the value of oldPointer shall be considered invalid.
    // the value of oldPointer may NOT be dereferenced anymore.
    // also notice that you may NOT call free(oldPointer).

    // Normally we save the value of newPointer into oldPointer
    // so that the value of oldPointer becomes valid and usable again
    oldPointer = newPointer;
}

如果免費(newPointer)會發生什么?

如果newPointer指向與newPointer相同的內存, oldPointer不再允許取消引用任何指針。 例:

oldPointer = newPointer;
free(newPointer);
oldPointer[9] = something;  // Illegal !!
newPointer[9] = something;  // Illegal !!

根據標准

free函數導致ptr指向的空間被釋放,即可用於進一步分配。 如果ptr是空指針,則不執行任何操作。 否則,如果參數與之前由calloc,malloc或realloc函數返回的指針不匹配,或者如果通過調用free或realloc釋放了空間,則行為未定義

暫無
暫無

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

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