【发布时间】:2010-12-07 14:35:31
【问题描述】:
关于在 malloced 字符串上使用 strtok 有什么我应该知道的吗?
在我的代码中我有(一般而言)
char* line=getline();
Parse(dest,line);
free(line);
getline() 是一个函数,它返回一个 char * 到一些分配的内存。
而Parse(dest, line)是一个在线解析的函数,将结果存储在dest中,(之前已经部分填充,来自其他信息)。
Parse() 在线调用strtok() 的次数不定,并进行了一些验证。
每个令牌(指向 strtok() 返回的指针)都被放入队列中,直到我知道我有多少。
然后将它们复制到 dest 中的 malloc'd char** 中。
现在free(line)
以及释放 dest 中 char*[] 的每个部分的函数,两者都出现在 valgrind 上:
“地址 0x5179450 是一个大小为 38 的块中的 8 个字节”
或类似的东西。
我正在考虑重构我的代码,不直接将令牌存储在 char** 上,而是存储它们的副本(通过将空间 == 分配给 strlen(token)+1,然后使用 strcpy())。
【问题讨论】:
-
我相信这一点:stackoverflow.com/questions/1495368/strtok-and-memory-leaks,这有助于回答我的问题。
-
strtok 很明显地修改了字符串,在分隔符所在的位置添加空值。并返回指向这些部分开头的指针