我正在尝试学习C,因为我想为Python编写C扩展。目前,我对内存分配感到困惑,我还不太了解它是如何工作的。我基本上看了medium中描述的哈希表实现。您可以在github上找到代码。
给我带来麻烦的部分是put函数(或ht_put,他称之为)。有一个struct Node
用来建立链斗列表:
typedef struct List
{
char *key;
char *value;
struct List *next;
} List;
并且在put函数中,键/值对基本上会被复制和分配,以便他能在以后释放它们,如果我理解正确的话:
node->key = strdup(key);
node->value = strdup(value);
我不明白,为什么他要麻烦复制这些值。我尝试直接使用这些值,而不复制它们(并删除免费的值),并且效果很好。我想知道,是否要复制自动局部变量,如果您不复制它们或类似的东西,但是我用valgrind找不到任何线索。
通常,这些语句中使用的参数键和值
node->key = strdup(key);
node->value = strdup(value);
没有必要进行动态分配。例如,键可以是指向字符串文字的指针或指向本地字符串的指针。而且,即使这些参数是动态分配的,它们的所有者也可以删除它们。在这种情况下,将至少有两次尝试释放相同程度的内存。