0

我在测试一些代码时遇到了一个可怕的错误。我发现这是由于调用链表中的节点free(p_current_item->s)where is 引起的,而 s 是它包含的 char* 。p_current_item我通过调用 addItem(node,char*) 方法创建了节点,该方法只是将元素添加到列表中:p_head=addItem(p_head,"this gets added"); 困扰我的是:

1)为什么我需要释放元素中包含的字符串。我知道当 s 被声明为时是必要的char* s = snprintf(s,(size_t),30,"this gets added");(这在我的类示例中是如何完成的)但为什么这是必要的 - 是否有可能在结构(在本例中为 linkedList 节点)中包含属性结构本身被释放了吗?

2)当我试图释放明确声明的 s 的值时发生了什么

3)我是否需要以其他方式释放 s 的价值?

谢谢 :-)

4

4 回答 4

4

您只能使用调用系列free分配的内存。malloc

用双引号封装的字符串是编译时常量。它们与指令文本一起被导入到您的运行时程序中。因此,那些还没有被动态分配。

snprintf返回生成的字符串的长度,而不是指向它的指针。正确的用法是:

size_t length = snprintf(s,(size_t)30,"this gets added");

s1)如果它是使用分配的malloccalloc或者来自该家庭的另一个电话,您只需要释放它。例如char* s = malloc(1024);

2)free("constant string");充其量会导致分段违规,因为您正在尝试释放尚未由malloc调用系列分配的内存。通常这是未定义的行为。

3)您不需要释放常量字符串,它们是您的文本的一部分,即使您想这样做也无法释放。

于 2012-10-11T14:41:12.927 回答
0

当您s在代码中声明时,它不会在堆中分配。并且free()仅当您需要使用malloc或释放​​在堆中动态分配的内存时才调用calloc- 在您的代码中不是这种情况。

于 2012-10-11T14:40:30.530 回答
0

"this gets added"像全局和static变量一样,文字字符串在可执行文件中分配了固定的内存地址。您不需要也不能取消分配它们。

如果您遇到清理函数不知道是否需要调用的情况free(),有时可能需要,最好的解决方案是创建所有内容的基于堆的副本并始终调用free(). 您可以方便地使用以下字符串对字符串执行此操作strdup()

p_head=addItem(p_head, strdup("this gets added"));
于 2012-10-11T14:40:39.307 回答
0

1)为什么我需要释放元素中包含的字符串。我知道当 s 被声明为 char* s = snprintf(s,(size_t),30,"this gets added"); (这是在我的类示例中完成的方式)但是为什么有必要 - 当结构本身被释放时,是否可以释放结构中包含的属性(在本例中为 linkedList 节点)?

您需要释放已分配的任何内存

char *s = snprintf(s, ...)

做错了。你需要:

char *s = NULL;   // Declare memory -- and initialize it to NULL just to be safe.
                  // This way, using unallocated memory will be easily spotted.

s = malloc(30);   // Allocate the memory
if (NULL == s)    // Check that it has been allocated.
{
    abort();
}
// Use the memory: sprintf into s
snprintf(s, "My name is %s", 30, "John");

// Use the result
printf("%s\n", s);

free(s);    // Free the memory
s = NULL;   // If you're really paranoid, NULL out its pointer.
            // This way, also using no-longer-allocated memory will be spotted.

你也可能会遇到valgrind并发现他是一个固执但有价值的朋友。

2)当我试图释放明确声明的 s 的值时发生了什么

没什么好的 :-) 。内存分配器发现了一个错误,并立即使您的程序崩溃以避免更糟的情况发生。

3)我是否需要以其他方式释放 s 的价值?

如果你已经分配了,是的。看上面。

于 2012-10-11T14:44:46.767 回答