【问题标题】:gdb gives an error, but program runs finegdb 报错,但程序运行正常
【发布时间】:2010-02-06 18:18:19
【问题描述】:

我有一个简单的 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;
}

【问题讨论】:

  • 调用realloc的代码是什么样子的?
  • 你是否在 realloc 之后检查失败?
  • 没有错误是警告
  • 我认为您在第 42 行有错误。或者,给我们看一些代码。

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


【解决方案1】:

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

【讨论】:

  • 鉴于您总是覆盖已分配缓冲区中存储的内容,因此根本不需要使用 realloc - 只需 freemalloc 就可以了。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-01-30
    • 2018-09-02
    • 2020-07-29
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多