gpt4 book ai didi

c - 内存空闲抛出 segFault

转载 作者:行者123 更新时间:2023-11-30 15:39:02 25 4
gpt4 key购买 nike

我正在使用链接列表实现符号表,代码工作正常,但代码中存在内存泄漏,

我有以下结构

struct node
{
char* pcKey;
void* pvValue;
struct node *next;
};

struct _Sym
{
int totalBindings;
struct node *node;
};

添加我有 sym_new 方法为 sym 实例分配内存

sym Sym_new (void)
{
_Sym *m_SymTable_t = (_Sym*) malloc (sizeof(_Sym));

if(m_SymTable_t == NULL)
{
return NULL;
}
else
{
m_SymTable_t->totalBindings = 0;
m_SymTable_t->node = NULL;
return m_SymTable_t;
}//endif
}

我根据字符串长度为其他函数中的键和值分配内存。

免费方法是

typedef struct _Sym *Sym;

void Sym_free (Sym m_SymTable_t)
{
assert(m_SymTable_t != NULL);

struct node* temp = m_SymTable_t->node;

struct node *currentBinding = NULL;
while(temp != NULL)
{
currentBinding = temp;
temp = temp -> next;

//Removing comment for the below line throws segfault
//free(currentBinding -> pcKey);
//free(currentBinding -> pvValue);

free(currentBinding);
}

free(m_SymTable_t);
}

完全释放符号的正确方法是什么?

我已在链接中上传了我的 symTable_Link.cpp 文件

最佳答案

变量pcKeypvValue可能应该初始化为 nullSym_new()功能。否则它们可能包含任何旧值。这是因为malloc不一定将分配的内存归零:它只是分配一 block 内存,因此内存可能会被垃圾填满。

所以,如果出于某种原因 sym_put()不会为新创建的对象调用这些指针,这些指针可能指向无效内存,并且在您调用 free() 时段错误。如果将它们初始化为 null free()只会忽略它们并且不会尝试释放内存。

一种“hacky”仅调试技术,您可以使用它来检查pcKeypvValue变量肯定是由 sym_put 分配的调用将在 sym_new 中初始化它们具有虚拟值,例如 0xCDCCDCD (请注意此处的指针宽度......这就是为什么我称其为 hacky 技术)。然后在 sym_free在释放之前检查这个魔术常数 pcKeypvValue 。如果你找到了它,那就有问题了......

同样令人感兴趣的可能是线程 Do I cast the result of malloc?

编辑:

查看链接的代码,您似乎放弃 const!

函数id定义为:

int SymTable_put (SymTable_t m_SymTable_t, const char *pcKey, const void *pvValue)

但是这个 Actor 阵容...

temp->pcKey = (char*)pcKey;
temp->pvValue = (char*)pvValue;

这是一个坏主意。您正在“欺骗”编译器,使您的 const promise 无效。

错误:好的,所以你分配如下

temp->pcKey = (char*) malloc (sizeof(char) * strlen (pcKey));

但是然后你使用覆盖这个指针

temp->pcKey = (char*)pcKey;

所以你a)有内存泄漏,b)刚刚存储了错误的指针,这很可能是你得到段错误的原因。你可能想做的是( strdup 在这里很有用)...

temp->pcKey = strdup(pcKey);

这将为pcKey中的字符串分配新的内存。并将字符串复制到新内存中。

我猜测你是这样调用这个函数的......

SymTable_put (xxx, "KEY string", "VALUE string");

然后你的代码做了这个

temp->pcKey = (char*)malloc (sizeof(char) * strlen (pcKey));
...
temp->pcKey = (char*)pcKey;

现在temp->pcKey指向“KEY string”本身,而不是它的副本。因此,当您尝试释放字符串常量时,您的程序会提示。您想要做的是复制 pcKey 中的字符串进入temp->pcKey而不是覆盖指针。

编辑:根据评论 malloc s 需要空格 + 1 来包含空终止符。另外sizeof(char)始终为 1,因此是多余的。试试strdup插入。

关于c - 内存空闲抛出 segFault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21609215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com