2012-01-25 37 views
3

我有像這樣的結構體,解放出來潛在未初始化的結構成員

typedef struct Player { 
    char *name; 
    char *heroID; 
    char *heroName; 
    int slotNo; 
} Player; 

然後我將其定義爲靜態分配的陣列

Player players[10]; 

我的程序可能需要退出時,我還沒有完全在players中分配了Player結構中的每個char*字段的所有字段,並且我已經決定在退出之前釋放任何已分配的內存,即使現代操作系統不要求您這樣做,因爲這樣做是很好的編程實踐。

但是,我不能只是循環通過playersfree(player[i].name)等,因爲它可能是未初始化的。

解決此問題的唯一方法是,在定義數組並然後釋放內存後,手動將每個char指針初始化爲NULL,然後檢查指針是否爲NULL,以決定是否應釋放它?

如果是這樣,當我通過使用大括號聲明播放器數組時,什麼是初始化,循環和手動賦值或定義值的最佳方式。還是有另一種方式?

+2

'我決定在退出之前釋放任何已分配的內存,即使現代操作系統不需要你,因爲這樣做是一種很好的編程習慣。「並非如此。我認爲這是浪費時間和可讀性。如果您正在編寫庫,則必須始終清理,因爲用戶可能決定處理該錯誤並繼續。但是對於一個應用程序來說,只要退出內存錯誤就是一種理智的行爲。 – orlp

+0

我與他的回覆:)爆米花:) http://blogs.msdn.com/b/oldnewthing/archive/2012/01/05/10253268.aspx - 說,你真的應該calloc()作爲Jakub下面提到所以你永遠不會有無效的垃圾指針 – iccir

+0

@nightcracker我基於我對這些線程的決定,http://stackoverflow.com/questions/3126122/in-c-is-it-necessary-to-free-a-pointer-at - 出口,http://stackoverflow.com/questions/5405843/is-it-up-to-the-programmer-to-deallocate-on-exit,http://stackoverflow.com/questions/2213627/when-you -exit -ac-application-is-the-malloc-ed-memory-automatically-freed – Michael

回答

4

解決此問題的唯一方法是,在定義數組之後手動將每個char指針初始化爲NULL,然後釋放內存時檢查指針是否爲NULL,以確定是否應該釋放它?

這絕對不是唯一的方法,但它是最常見和最標準的方式。實際上,大多數程序員會通過總是將指針初始化爲零來防止seg故障。

最好的初始化方法是創建一個for循環或memset一切爲零(或使用calloc,這是最簡單的)。

3

您可以使用calloc創建一個指向結構的指針,以便所有字段都將初始化爲0(NULL)。

將未使用的指針初始化爲NULL是非常重要的。如果沒有,你是一個賽格故障一個最好的辦法

編輯(1)

當然,在你的情況下,你可以使用一些bool is_used標誌中的每個結構內,但你可以用NULL做的更好指針。我發現沒有理由這樣做。

+0

所以你認爲這個結構的指針數組比這個實例中的結構數組更好? – Michael

+0

既不好也不壞。取決於場景。如果我有10個'Player'結構的固定數組,並且其中一些可以是「空的」,那麼我會在數組中使用'NULL'指針,或者在結構中使用一些'bool is_used'標誌。但第一種解決方案對我來說更爲自然 –

3

您可以定義數組是這樣的:

Player players[10] = { 0 }; 

這將設置整個陣列及其所有成員0(這是什麼NULL真的是)。

+0

根據標準IIRC,「NULL」不一定必須等於整數值「0」。 (雖然我仍然需要找到一個編譯器,其中'NULL!= 0'。) – orlp

+0

@nightcracker這個評論也適用於你的答案,並且使它無效! –

+0

@David Hefferman:的確,我是一位魔鬼的擁護者;) – orlp

1

由於您的數組具有靜態存儲持續時間,所以它有一個隱式初始值設定項。您的代碼就相當於

Player players[10] = { 0 }; 

那麼,你是安全的,無論你什麼時候分配他們發生了什麼通過這些指針free

話雖如此,如果malloc失敗的呼叫不會感到驚訝,如果後續調用free也失敗。一旦你有堆分配失敗,中止這個過程通常是合理的。