【问题标题】:Program aborts after freeing previously allocated memory释放先前分配的内存后程序中止
【发布时间】:2012-04-28 10:35:41
【问题描述】:

我将向您寻求一些帮助,该程序实现了一个搜索计划算法,它非常简单。好吧,我遇到的问题对我来说有点奇怪:在为函数中本地声明的简单字符数组分配内存后,我处理了这个数组,它具有所有预期的行为并且一切正常,但是当我调用free() 函数在函数结束之前对该数组执行,程序停止并中止。如果有人对这个问题有一些经验(或没有......)可以帮助我,我会非常感激。好吧,这里有几行“模拟”代码来显示我在说什么(这不完全是写的,而是:

char* v_AllTheWorld
char* v_ReadALineOfTheWorld;

v_AllTheWorld = malloc(COLUMNS * LINES * sizeof(char)); /*LINES and COLUMNS are defined constants*/

if(v_AllTheWorld == NULL)
{
    fprintf(stderr, "..."); //etc, etc.
    exit(1);
}

v_ReadALineOfTheWorld = malloc(COLUMNS * sizeof(char)); /*the "sizeof(char)" looks useless, but there's no point in talking about that here, i guess.*/

if(v_ReadALineOfTheWorld == NULL)
{
    fprintf(stderr, "..."); //etc, etc.
    exit(1);
}

while(/*some_condition (number of lines to be read)*/)
{
    //read data string from stream and stores in v_ReadALineOfTheWorld (fscanf);
    //appends the read data to v_AllTheWorld (strncat);
}

free(v_ReadALineOfTheWorld);
/*The program is stopping right after this call in the debug.*/

return v_AllTheWorld;

我没有把函数的头部,它的声明,也没有详细表示流或数据是如何操作的,但没有进行其他“malloc”或“free”的调用并且所有编写的代码都是无条件执行的(在任何“如果”或类似的情况下)。当然,最后一个行为不包括分配测试,但你明白我的意思。

所以,好吧,我希望我这样做是正确的,我希望我以正确的方式详细说明了问题,希望你能帮助我。

哦,我差点忘记了:你可能注意到了,程序是用 C 语言编写的。

【问题讨论】:

  • 我们可以看到while循环的内容吗?我怀疑您正在增加指针v_ReadALineOfTheWorld,其中free(v_ReadALineOfTheWorld) 会导致未定义的行为。请注意,您要释放的指针应该与从 malloc 返回的指针相同。
  • 您是否尝试过使用 GDB 并查看内存位置?
  • 另外,试试calloc(v_ReadALineOfTheWorld,0)
  • 当您遇到任何类型的崩溃时,您的第一反应应该是在调试器中运行程序。它不仅可以帮助您确定崩溃的位置,还可以让您检查内存和变量以查看可能导致崩溃的原因。如果崩溃发生在free 之类的地方,您还应该逐步检查所有修改您尝试释放的内存的代码,以确保您没有写越界或修改实际指针。
  • 好吧,我可以发布在此期间发生的事情,但您可以确定我没有在那里增加指针。实际上,在循环内使用指针的唯一命令是括号内的函数(fscanf 和 strncat,是第二个的 seconpd 参数)。我只是想看看指针的值,它一直都是一样的。 ^^ 不过谢谢。而且... noMAD,我没有尝试过你说的任何一个。我会尝试并说出发生了什么,但不是今天。也谢谢你。

标签: c dynamic memory-management


【解决方案1】:

如果您在v_ReadALineOfTheWorld 的范围之外写入,可能会发生这种情况。一些malloc 库将有关mallocd 区域的信息存储在该区域周围的包装器中,如果您破坏该信息free 可能会崩溃。

【讨论】:

  • 好吧,我会试着检查一下。谢谢。
猜你喜欢
  • 2013-08-07
  • 2011-11-21
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
相关资源
最近更新 更多