为什么当我调用malloc()为链接列表创建节点时出现内存泄漏?

时间:2019-04-05 15:45:44

标签: c memory-leaks lldb

我是一名学生,目前正在研究一个图形项目,在该项目中,我读取了一个包含数字的文件,其中数字在文件中的位置定义坐标,而值则定义海拔高度。例如:

1 0 0 -1 -1 0 1 1 0 0

-1 0 0 0 1 0 0 0 0 0

-1 1 0 0 -1 1 0 0 0 1

当x = 0,y = 0时,z = 1

当x = 1,y = 0时,z = 0

我编写了代码,并且工作正常。我要做的是逐行读取文件并将行存储在名为char**的{​​{1}}指针中,其中每个值tab包含一行的每个值。 我没有创建2d数组,而是将每行存储在一个链表中。 之所以这样做,是因为我已经有一段代码来逐行读取一个文件,以及一个将字符串返回*tab的代码。

但是我有一些内存泄漏。为了找到这些泄漏,我使用-g标志使用gcc编译了所有.c文件,然后在OSX上使用LLDB和Leaks命令。我通过逐步执行代码来调试代码。这是我从LLDB获得的:

char **

在执行第20行之前,我没有泄漏:

(lldb) n
Process 20739 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = step over
    frame #0: 0x0000000100001d66 fdf`ft_new(tab=0x0000000100207530) at ft_lst_gnl.c:22
   19       node = NULL;
-> 20       if (!(node = (t_gnl *)malloc(sizeof(t_gnl))))
   21           return (NULL);
   22       node->tab = tab;
   23       node->next = NULL;
   24       return (node);
   25   }

但是当我执行这一行时,Leaks命令的输出就会改变:

Date/Time:       2019-04-05 17:13:34.357 +0200
Launch Time:     2019-04-05 17:13:15.974 +0200
OS Version:      Mac OS X 10.12.6 (16G29)
Report Version:  7
Analysis Tool:   /Applications/Xcode.app/Contents/Developer/usr/bin/leaks
Analysis Tool Version:  Xcode 9.2 (9C40b)
----

leaks Report Version:  2.0
Process 24286: 607 nodes malloced for 66 KB
Process 24286: 0 leaks for 0 total leaked bytes.

这是我的结构t_gnl:

leaks Report Version:  2.0
Process 24286: 608 nodes malloced for 66 KB
Process 24286: 1 leak for 16 total leaked bytes.
Leak: 0x100400100  size=16  zone: DefaultMallocZone_0x1000b2000
    0x00000000 0x00000000 0x00000000 0x00000000     ................

我与测试代码进行了比较,在测试代码中,我使用malloc创建了另一个链表或字符串,并使用调试方法(LLDB + Leaks命令)对其进行了测试,并且包含malloc()的行没有泄漏。

感谢阅读。

编辑:这是我的一些代码。我可以添加更多,但恐怕会太多且令人困惑。

typedef struct  s_gnl
{
    char            **tab;
    struct s_gnl    *next;
}               t_gnl;

PS:对不起,如果我犯了一些语法错误,我是法国人。如果还不清楚,我可以尝试给出更好的解释。另外,这是我关于Stackoverflow的第一篇文章,所以我可能忘记了一些信息。

0 个答案:

没有答案