1

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

当我使用 调整大小一次时reallocgdb不会显示任何错误,但是,如果我再次尝试调用 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;
}
4

2 回答 2

3

class->name = name没有做你认为的那样。用于strncpy()将输入字符串复制到新分配的内存中。你在那里的那个分配泄漏了你分配的内存并覆盖了指针。然后下次你调用时setName(),你最终会realloc()用一个你没有得到的指针调用malloc()。我希望您在某个地方setName()使用常量、全局变量或局部变量字符串调用,这就是最终产生错误的原因。如果您只setName()使用从中获取内存的字符串进行调用malloc(),您将看不到来自 gdb 的警告(但您仍然会遇到错误!)。

于 2010-02-06T18:32:37.610 回答
0

在 valgrind 或电栅栏下运行它——这些会为你发现内存溢出

于 2010-02-06T18:31:43.933 回答