2012-01-25 36 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也失败。一旦你有堆分配失败,中止这个过程通常是合理的。