2013-12-09 81 views
0

我想我知道但我不想讓我的工作不正確。爲什麼realloc需要兩個指針?處理返回NULL?

你看到的是大部分的例子...

char* temp; 
char* temp1; 

temp = malloc(10, sizeof(char); 
temp1 = realloc(temp, 11*sizeof(char)); 

現在我假設你不使用...

temp = realloc(temp, 11*sizeof(char)); 

因爲如果沒有足夠的內存,你得到一個NULL ptr返回,因此無法訪問原始內存塊。

那麼下面是處理返回NULL指針的好方法嗎?

while((temp1 = realloc(temp, 11*sizeof(char))) == NULL) 
    sleep(3); 

temp = temp1; 
temp1 = NULL; 

我知道有些人說,當你在你的代碼中加入睡眠時,可能會有更好的方法。但我看到它的方式,我別無選擇,只能等待。

+3

如果'realloc()'返回NULL,那麼你有嚴重的問題。不,這不僅是兩個指針是必要的原因。如果指針指向的內存塊被擴展,那麼它可能不再適合它的原始位置,所以'realloc()'將需要移動它,改變指針(並使其無效)。 – 2013-12-09 22:05:10

+0

「睡眠」應該給操作系統一個移動內存的機會嗎?無論如何,我不認爲我會依賴一個*無限循環*,因爲它可能永遠循環。 – usr2564301

+0

考慮失敗的操作或找到一些不必要的緩存/數據來刷新。睡眠不會幫助(單線程)應用程序用盡地址空間,因爲這與整個系統耗盡虛擬內存相反。 – doynax

回答

1

現在我假設你不使用temp = realloc(temp, 11*sizeof(char));如果是因爲沒有足夠的內存,你得到一個 NULL PTR返回,從而留下沒有辦法訪問原始內存 塊。

正確。這會導致內存泄漏,如果temp是您對內存塊的唯一引用。

那麼下面是處理返回NULL指針的好方法嗎?

否。該循環可能會永久循環。在這種情況下,你不可能簡單地擴展到11個字節。正如H2CO3在評論中所說,如果這樣做失敗了,你會遇到嚴重的問題。

如果您的系統內存不足,它可能會變得不穩定。如果只有你的進程碎片化了內存或者耗盡了地址空間,那麼除非你的程序的其他部分忙於糾正這個問題,否則無需等待。

當內存分配失敗時,您需要一個複雜的恢復策略或乾淨的退出策略。嘗試聰明分配會讓你的程序非常難以遵循。除非你正在編寫的東西將成爲空間探測器或其他關鍵任務設備的一部分(這不太可能依賴動態內存),否則最好的策略是發出有用的錯誤消息並乾脆退出。現在


,我只寫了這一切,然後看到你的澄清在評論有關你在做什麼實際上做。如果你對睡眠環解決你的問題感到高​​興,那就去做吧,但是在那裏放一些代碼來檢測異常的等待並報告它們,這樣在調試時你就不會發瘋。

一個更豐富的解決方案是將這些東西包裝到自己的內存管理器中,並使用信號量驅動的隊列或爲您的程序量身定製的其他機制。使用睡眠有點幼稚。

此外,我不會建議分配小塊數據。如果你做了很多事情,你可能會分裂你的記憶。如果你需要的話,那麼你可能需要在每個線程中做內存池,並讓它們請求更大的塊。

+0

所有這些數據都來自TCP連接。所以我更希望得到一個超時,因爲realloc的持續NULL返回。這是我想要處理的超時,因爲我真的別無選擇,只能嘗試接收所有這些數據。 – JoeManiaci

相關問題