我浏览了很多单向链表的例子,它作为堆栈工作。它们有以下共同点:它们总是在 pop() 函数中对弹出的项目使用 free,例如:
struct Node
{
struct Node *Next;
}*Head;
void pop()
{
struct Node *cur_ptr=Head;
....
Head = Head->Next;
// do something with cur_ptr
free(cur_ptr);
....
}
我是否总是需要使用该规则?我可以在弹出功能中没有免费项目的情况下从列表中弹出项目吗? 我想要实现的是在程序启动时只分配一次列表,并避免在每次调用 pop、push 函数时取消分配和分配内存。我想要弹出项目,使用项目并再次将其推送(在程序的其他部分)以列出以供重用。 这种方法有什么问题吗?
非常感谢您的意见和帮助。
最佳答案
您必须确保在不再需要时释放分配的内存,这就是重点。
如果有任何机会,您丢失了对动态分配地址的引用而没有释放它,那么您将发生内存泄漏,嗯:
void pop() {
// get element from stack
// use it
// not call free
}
如果您不在任何地方存储弹出项目的地址,这将产生泄漏。
如果你想重用分配的项目,那么你可以自由地这样做,在这种情况下你不应该释放它们,例如:
void push() {
struct Node *ptr = pop_unused_node();
if (!ptr) // if no unused node is found then we need a new one
ptr = malloc(sizeof(struct Node));
*ptr = data;
push(ptr);
}
void pop() {
struct Node *ptr = pop();
// use data
push_unused_node(ptr);
}
void clearup() {
for each node in unused list
free(node);
for each node in stack
free(node);
}
关于c++ - pop() 中没有 free() 的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20954530/