【问题标题】:Why program dies using malloc and free (same address)为什么程序使用 malloc 和 free 死掉(相同的地址)
【发布时间】:2015-06-11 16:10:16
【问题描述】:

我面临与 malloc 和 free 相关的关键问题。

'A' 线程使用 malloc 分配内存。 和“A”线程完成。

“B”线程从分配的“A”线程中释放内存,但有时程序已死。

所以我打印了内存地址但同样的 malloc 地址和空闲地址。

如何调试这种情况?

请给我建议。

这样的示例代码

malloc 和 free 之间的 dlmalloc 元数据也相同。 如果不使用线程,也会出现同样的问题。

嗯...分配的内存内容修改了安全世界的操作系统。

Polling function
{
    poll((struct pollfd *)&Event, 2 10000);
    read(fd, &index, sizeof(uint));
    pthread_create(&thread[index], NULL, SomeFunction, (void *)index);
    pthread_detach(thread[index]);
}


void SomeFunction(uint *arg) 
{
    uint command;
    command = (uint)arg;

    switch(command) {
        case malloc:
            MallocFunction();
        break;
        case free:
            FreeFunction();
        break;
    }
    Ioctl(fd, .....);
}


MallocFunction() 
{
    uint mem;

    mem = malloc(uint);
}

FreeFunction()
{
    uint mem;

    GetMallocMemory(&mem);

    free((char *)mem);
}

【问题讨论】:

  • 使用 gdb?请发布显示错误的代码的最小工作示例,我们很乐意查看!
  • 失败时你能提供任何输出吗?你有违规代码的代码 sn-ps 吗?
  • 你需要在你的编程中非常清楚谁有责任删除内存以及何时发生。您必须安排您的程序,以便保证正确的操作顺序。大部分时间只是猜测并希望能做对是灾难的根源。

标签: c linux memory malloc free


【解决方案1】:

在多线程中,你不能保证线程的执行顺序,除非它们是同步的。在您的情况下,线程有可能在另一个线程分配内存之前取消分配内存。

代码 sn-p 将有助于进一步检查问题。

【讨论】:

    【解决方案2】:

    首先,在您的MallocFunction 中,您将一个地址分配给一个整数变量。根据编译代码的机器的地址长度,地址可能会被截断(32 位与 64 位)。

    其次,您正在使用局部变量 (mem) 来保存分配的地址。函数完成后,此变量将失去其作用域。我很好奇你的GetMallocMemory 函数是什么样子的。

    尝试先解决这些问题。

    【讨论】:

    • 嗯。我的目标板使用 32 位 arm 处理器,因此 unsigned int 可能获得地址。 GetMallocMemory 表示获取分配的内存地址。实际上,此代码与 ARM 安全扩展相关。我打印了内存地址,并且我将每两个地址都设置为相同的。我调试了一个死机。我找到了一些职位。嗯.. dlfree 和内存使用错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2022-11-25
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多