可能重复:
What is the best way to check for memory leaks in c++?
我正在 C 中编写一个双向链表,其中大部分已实现并正常工作(我只需要在遍历和可能释放时修复一些小的逻辑错误)。
问题: 我怎么能完全确定我释放了所分配的所有内存?我还想知道是否有任何技术可以优化我的分配。关于它如何工作或链接到教程的任何提示或提示也受到赞赏。
我几乎是一个初学者,所以修复我的编码技术的任何其他技巧将不胜感激。我使用 gdb 进行调试,我在 Archbang Linux x86_64上运行。
感谢您的帮助。
以下是双向链表的结构:
typedef struct node_element{
double data;
} element;
typedef struct node_t{
struct node_t *prev;
struct node_t *next;
struct node_element element;
} node;
typedef struct list_t{
struct node_t *head;
struct node_t *tail;
} list;
这是我创建列表的方式:
list *createList(){
list *temp = malloc(sizeof(list));
temp->head = malloc(sizeof(node));
temp->tail = malloc(sizeof(node));
temp->head->prev = NULL;
temp->head->next = temp->tail;
temp->tail->prev = temp->head;
temp->tail->next = NULL;
return temp;
}
新节点:
node *newNode(element * element){
node *current = malloc(sizeof(node));
current->element.data = element->data;
return current;
}
删除单个节点,与我的问题不太相关,但可能有用:
node *removeNode(list * list, node * current){
if (current->prev == NULL)
list->head = current->next;
else
current->prev->next = current->next;
if (current->next == NULL)
list->tail = current->prev;
else
current->next->prev = current->prev;
free(current);
return NULL;
}
现在重要的是,当我完成列表时,我称之为函数:
list *removeList(list * list){
node *temp; //Revised.
//node *temp = malloc(sizeof(node));
while (list->head != NULL){
temp = list->head->next;
free(list->head);
list->head = temp;
}
return NULL;
}
像这样:
a_list = removeList(a_list);
答案 0 :(得分:3)
在其提供的众多功能中,Valgrind将允许您check for memory leaks。它通过动态检测内存管理功能来实现这一点。
你可以使用这样的命令:
valgrind --tool=memcheck --leak-check=yes my_prog
答案 1 :(得分:-1)
如果你想释放内存你可以调用释放内存的free()函数,或者释放内存的dealloc()函数,并且你正在使用函数,所以你所做的指针变量仅限于范围一旦函数终止,该函数会自动解除分配。