gdb给出错误,但程序运行正常

时间:2010-02-06 18:18:20

标签: c memory-management malloc dynamic-memory-allocation realloc

我有一个简单的C程序,它有一个指向字符数组的指针。要启动它,我使用malloc,然后调整大小,然后在程序中将其设置x次。

当我使用realloc调整一次大小时, gdb 不会显示任何错误,但是,如果我再次尝试调用resize函数, gdb 会显示以下错误:

warning: Invalid Address specified to RtlReAllocateHeap( 003E0000, 00404076 )

为什么不止一次调整大小的想法会产生这个错误?

修改

我玩了它,当我注释掉指针数据的设置时,似乎错误没有发生,这是在调整大小之后。

void setName(struct class_x *class, char *name)
{
    class->name = (char *) reallocateMemory(class->name, sizeof(char) * strlen(name) + 1);
    class->name = name;
}

void *reallocateMemory(void *member, size_t size)
{
    void *tmp = realloc(member, size);
    if(tmp == NULL)
    {
        //handle
    }
    return tmp;
}

2 个答案:

答案 0 :(得分:3)

class->name = name并没有按照您的想法行事。使用strncpy()将输入字符串复制到新分配的内存中。你在那里的任务是泄漏你分配的内存并覆盖指针。然后,当您下次致电setName()时,您最终会使用您未从realloc()获得的指针调用malloc()。我希望你用某个常量,全局变量或局部变量字符串调用setName(),这就是最终产生错误的地方。如果您只是使用setName()来自malloc()的字符串来调用{{1}},那么您将看不到来自gdb的警告(但您仍然有错误!)。

答案 1 :(得分:0)

在valgrind或电围栏下运行 - 这些将为你发现内存超支