如何在结构中释放char *?

时间:2017-05-03 14:23:51

标签: c pointers free

 1| typedef struct container{
 2|     char* abc;
 3| }container;
 4|
 5|
 6| int main(void){
 7|
 8|     container* xyz = malloc(sizeof(container));
 9| 
10|     xyz->abc = malloc(10);
11|     xyz->abc = "abcdefghi\0";
12| 
13|     free(xyz->abc);
14|     free(xyz);
15| }

根据Valgrind的说法,第10行有泄漏,这意味着免费(xyz-> abc)不起作用。我怎么能解脱这个?

4 个答案:

答案 0 :(得分:7)

您分配了10个字节,并存储了指向这些字节的指针(xyz->abc),然后您立即用指向字符串文字("abcdefghi\0")的指针替换了该指针。

您的计划有几个问题:

  1. 十个泄漏的字节
  2. 字符串文字中超出\0 - 为什么?
  3. free - 你没有malloc(被替换的指针)
  4. 首先使用malloc / free(假设标记不是虚假的)
  5. 在C中,使用strdupabcdefghi置于动态分配的缓冲区中。

    在C ++中,忘记这一点并切换到std::string

答案 1 :(得分:3)

在你的代码中,xyz->abc finally 不包含内存分配器函数返回的指针,它保存指向包含字符串文字{{1}的数组的第一个元素的指针}。您不需要"abcdefghi\0"

相反,在当前方案中将free()传递给xyz->abc导致undefined behavior,因此答案归结为,必须尝试传递指针早期free()和家人或free()未返回的malloc()

引用NULL,章节§7.22.3.3

  

[....]否则,如果   该参数与先前由内存管理返回的指针不匹配   函数,或者如果通过调用C11free释放了空格,则   行为未定义。

答案 2 :(得分:1)

Put strcpy( xyz->abc, "abcdefghi" ); at line 11.

With xyz->abc = "abcdefghi\0"; you redirect xyz->abc pointer to static string and lose the allocated memory address. Then free will work with wrong address and will not free the dynamically allocated block. \0 is not necessary as mentioned above by @BoundaryImposition - every double quote enclosed string is null terminated and you add extra 0.

答案 3 :(得分:0)

传递给free()的值必须是malloc()realloc()之类的值返回的值。传递给free()的任何其他值都无效。

您的代码使用malloc()分配内存,并将结果分配给xyz->abc。但是下一行会将"abcdefghi\0"的地址分配给xyz->abc

此时,xyz->abc 不再保留malloc()返回的值。

当您将此值传递给free()时,这是无效的,并且没有释放内存。那是你的泄密。