【发布时间】:2013-11-19 19:40:29
【问题描述】:
在使用垃圾收集语言 10 多年后,我回到了 C99,显然我在内存管理方面遇到了困难。
我有一个由堆栈项和类型Stack 组成的链表,该类型指向该链表第一个元素的地址。
这是我目前的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct StackItem
{
int head;
struct StackItem* next;
} StackItem;
typedef StackItem** Stack;
StackItem* makeStackItem (int head)
{
StackItem* a = (StackItem*) malloc (sizeof (StackItem) );
a->head = head;
a->next = (StackItem*) 0;
return a;
}
Stack makeStack ()
{
Stack stack = (Stack) malloc (sizeof (StackItem*) );
*stack = (StackItem*) 0;
return stack;
}
void pushStack (StackItem* item, Stack stack)
{
item->next = *stack;
*stack = item;
}
void freeStack (Stack stack)
{
StackItem* current = *stack;
StackItem* next;
while (current != 0)
{
next = current->next;
free (current);
current = next;
}
free (stack);
}
int main ()
{
Stack stack = makeStack ();
for (int i = 0; i < 10; i++)
pushStack (makeStackItem (i), stack);
printf ("Here be dragons.\n");
freeStack (stack);
return 0;
}
我的问题是:
makeStack和makeStackItem的第一行是否合理且 有必要吗?freeStack的最后一行是否合理必要?一旦
main返回,我之前是否释放了所有内存 分配了吗?如何查看我是否有内存泄漏?
非常感谢您。
【问题讨论】:
-
关于您的第四个问题,我建议您查看valgrind
-
不鼓励使用 malloc。我个人讨厌在 typedef 中隐藏间接寻址,这会降低代码的可读性( typedef StackItem** Stack; )
-
查理打败了我,但这就是为什么 - stackoverflow.com/questions/605845/…
-
在类型声明中,星号绑定到右边,并且应该间隔以强调这一点:
StackItem *stack,notStackItem* stack。 (很多人说正好相反。他们错了。) -
谢谢大家。我会调查这个 valgrind。