我是一名学生,目前正在研究一个图形项目,在该项目中,我读取了一个包含数字的文件,其中数字在文件中的位置定义坐标,而值则定义海拔高度。例如:
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的第一篇文章,所以我可能忘记了一些信息。