Linux 下用 Valgrind 查找内存泄漏小例子

星空下的约定 2024-08-19 ⋅ 12 阅读

在开发过程中,内存泄漏是一个常见但又很隐蔽的问题。它会导致程序执行时内存占用逐渐增加,直到最终耗尽所有可用内存,导致程序崩溃。为了解决这个问题,我们可以使用 Valgrind 工具来检测和调试内存泄漏。

什么是 Valgrind?

Valgrind 是一款强大的开源工具,用于检测内存泄漏和内存错误。它可以在 Linux 下进行运行,并提供了一系列有用的工具,如 Memcheck、Cachegrind、Massif 等。其中,最常用的是 Memcheck,它可以检测内存错误和泄漏。

安装 Valgrind

在 Ubuntu 上,可以通过以下命令来安装 Valgrind:

sudo apt-get install valgrind

如果你使用的是其他 Linux 发行版,请参考对应的包管理工具进行安装。

示例程序

下面我们来看一个简单的 C 语言示例程序,演示如何使用 Valgrind 检测内存泄漏。该程序实现了一个简单的链表数据结构,当程序结束时,会有一个内存泄漏。

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} Node;

Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (newNode != NULL) {
        newNode->data = data;
        newNode->next = NULL;
    }
    return newNode;
}

void insertNode(Node** head, int data) {
    Node* newNode = createNode(data);
    if (*head == NULL) {
        *head = newNode;
    } else {
        Node* current = *head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}

void printList(Node* head) {
    Node* current = head;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

int main() {
    Node* head = NULL;

    insertNode(&head, 1);
    insertNode(&head, 2);
    insertNode(&head, 3);

    printList(head);

    return 0;
}

使用 Valgrind

将以上代码保存到一个名为 leak_example.c 的文件中。然后在命令行中,使用以下命令编译和运行程序:

gcc -o leak_example leak_example.c
valgrind --leak-check=full --show-leak-kinds=all ./leak_example

Valgrind 会显示类似如下的输出:

==22111== HEAP SUMMARY:
==22111==     in use at exit: 24 bytes in 1 blocks
==22111==   total heap usage: 4 allocs, 3 frees, 73,744 bytes allocated
==22111== 
==22111== 24 bytes in 1 blocks are definitely lost in loss record 1 of 1
==22111==    at 0x483BE3F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==22111==    by 0x109177: createNode (leak_example.c:9)
==22111==    by 0x1091B7: insertNode (leak_example.c:22)
==22111==    by 0x109248: main (leak_example.c:42)
==22111== 
==22111== LEAK SUMMARY:
==22111==    definitely lost: 24 bytes in 1 blocks
==22111==    indirectly lost: 0 bytes in 0 blocks
==22111==      possibly lost: 0 bytes in 0 blocks
==22111==    still reachable: 0 bytes in 0 blocks
==22111==         suppressed: 0 bytes in 0 blocks
==22111== 
==22111== For counts of detected and suppressed errors, rerun with: -v
==22111== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

Valgrind 告诉我们程序存在内存泄漏,具体是在 leak_example.c 的第 9、22、42 行代码处。这意味着在创建节点、插入节点和释放节点时,程序发生了内存泄漏。

结论

本文介绍了如何在 Linux 下使用 Valgrind 工具来检测内存泄漏。我们编写了一个示例程序,并通过 Valgrind 检测到内存泄漏。Valgrind 是一个非常强大的工具,它可以帮助我们更好地调试和优化我们的代码,以提高程序的性能和稳定性。

希望通过这个例子,你能更加理解如何使用 Valgrind,并能在日常开发中避免内存泄漏的问题。


全部评论: 0

    我有话说: