[英]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嗎?
當你說“被使用”時,我認為你的意思是“指針可以被解除引用 ”。 換句話說 - 可以做*oldPointer
或oldPointer[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.