free():删除列表时在 tcache 2 中检测到双重释放
free(): double free detected in tcache 2 when deleting a list
#include <stdlib.h>
struct Stanza
{
struct Stanza *avanti, *sinistra, *destra;
};
static struct Stanza *Stanza = NULL;
static struct Stanza *stanza_inizio = NULL;
static struct Stanza *lista_stanze = (struct Stanza *)&stanza_inizio;
void insertinlist(struct Stanza *Stanza)
{
lista_stanze = Stanza;
if (stanza_inizio == NULL)
stanza_inizio = lista_stanze;
else
{
lista_stanze->avanti = stanza_inizio;
stanza_inizio = Stanza;
}
}
void createElement(void)
{
Stanza = (struct Stanza *)malloc(sizeof(struct Stanza));
if (Stanza == NULL)
{
exit(2);
}
Stanza->avanti = Stanza->sinistra = Stanza->destra = NULL;
stanza_inizio = Stanza;
insertinlist(Stanza);
}
void delete (void)
{
struct Stanza *scorritore = stanza_inizio;
struct Stanza *successivo;
if (scorritore == NULL)
{
// nothing
}
else
{
while (scorritore != NULL)
{
successivo = scorritore->avanti;
free(scorritore); // error: double free detected in tcache
scorritore = successivo;
}
stanza_inizio = NULL;
}
}
int main()
{
createElement();
delete ();
}
我在调用 free 时收到由 delete() 函数引起的错误“free():在 tcache 2 中检测到双重释放”,但我不明白为什么。
我尝试在具有不同列表的新空白文件中使用此代码并且它工作得很好,但是对于这个列表我不知道的东西是错误的
这是怎么回事?
在 delete()
中的这一行:
successivo = scorritore -> avanti;
successivo
和 scorritore->avanti
在整个 =-loop 的第一次迭代中具有相同的值,因此在第二次迭代中,尝试删除一个已经释放的块:
所以问题出在列表的构造上,而不是 delete()
函数上。该行:
stanza_inizio = Stanza;
in createElement()
似乎不太可能。它防止 insertinlist()
:
中的首次初始化块
if (stanza_inizio == NULL)
stanza_inizio = lista_stanze;
else{
来自 运行.
正在删除:
stanza_inizio = Stanza;
from createElement()
至少允许代码 运行 完成。除了该更正之外,我不想说代码在语义上是否真的正确(但我对此表示怀疑)。
然而,这个初始化至少是可疑的:
static struct Stanza *lista_stanze = (struct Stanza *) &stanza_inizio;
&stanza_inizio
具有类型 struct Stanza**
但您将其分配给 struct Stanza*
。它在任何情况下都无条件地分配给 insertinList()
,因此它实际上没有任何用处。
#include <stdlib.h>
struct Stanza
{
struct Stanza *avanti, *sinistra, *destra;
};
static struct Stanza *Stanza = NULL;
static struct Stanza *stanza_inizio = NULL;
static struct Stanza *lista_stanze = (struct Stanza *)&stanza_inizio;
void insertinlist(struct Stanza *Stanza)
{
lista_stanze = Stanza;
if (stanza_inizio == NULL)
stanza_inizio = lista_stanze;
else
{
lista_stanze->avanti = stanza_inizio;
stanza_inizio = Stanza;
}
}
void createElement(void)
{
Stanza = (struct Stanza *)malloc(sizeof(struct Stanza));
if (Stanza == NULL)
{
exit(2);
}
Stanza->avanti = Stanza->sinistra = Stanza->destra = NULL;
stanza_inizio = Stanza;
insertinlist(Stanza);
}
void delete (void)
{
struct Stanza *scorritore = stanza_inizio;
struct Stanza *successivo;
if (scorritore == NULL)
{
// nothing
}
else
{
while (scorritore != NULL)
{
successivo = scorritore->avanti;
free(scorritore); // error: double free detected in tcache
scorritore = successivo;
}
stanza_inizio = NULL;
}
}
int main()
{
createElement();
delete ();
}
我在调用 free 时收到由 delete() 函数引起的错误“free():在 tcache 2 中检测到双重释放”,但我不明白为什么。 我尝试在具有不同列表的新空白文件中使用此代码并且它工作得很好,但是对于这个列表我不知道的东西是错误的
这是怎么回事?
在 delete()
中的这一行:
successivo = scorritore -> avanti;
successivo
和 scorritore->avanti
在整个 =-loop 的第一次迭代中具有相同的值,因此在第二次迭代中,尝试删除一个已经释放的块:
所以问题出在列表的构造上,而不是 delete()
函数上。该行:
stanza_inizio = Stanza;
in createElement()
似乎不太可能。它防止 insertinlist()
:
if (stanza_inizio == NULL)
stanza_inizio = lista_stanze;
else{
来自 运行.
正在删除:
stanza_inizio = Stanza;
from createElement()
至少允许代码 运行 完成。除了该更正之外,我不想说代码在语义上是否真的正确(但我对此表示怀疑)。
然而,这个初始化至少是可疑的:
static struct Stanza *lista_stanze = (struct Stanza *) &stanza_inizio;
&stanza_inizio
具有类型 struct Stanza**
但您将其分配给 struct Stanza*
。它在任何情况下都无条件地分配给 insertinList()
,因此它实际上没有任何用处。