【问题标题】:Allocation of already allocated memory分配已分配的内存
【发布时间】:2013-04-08 10:53:28
【问题描述】:

我正在开发一个 Objective-C (iOS) 应用程序,它在应用程序的基于 C 的部分中使用非常大的数组(大小 > 10 000)。

在执行的那一刻,我做了一个小结构的 malloc,我有消息:

      malloc: *** error for object 0x6505a4: incorrect checksum for freed object - object was probably modified after being freed

消息给出的地址已被我在此调用之前使用的数组占用:

 write in address : 0x6505a0  - im_x[12]  // im_x is my array 
 write in address : 0x6505a8  - im_x[13]  // im_x is my array 

为什么 iOS 会尝试分配已使用的内存?

欢迎任何帮助:)

谢谢!

【问题讨论】:

  • iOS 不会尝试分配使用中的内存。您的代码中将存在导致此错误的错误。您能否创建一个最小的测试用例并编辑您的问题以包含该代码?
  • 如何创建阵列?
  • 斯蒂芬说了什么;我敢打赌,你超出了数组的末尾。

标签: objective-c c memory allocation


【解决方案1】:
  malloc: *** error for object 0x6505a4: incorrect checksum for freed object - object was probably modified after being freed

是一条消息,它告诉我您在某处损坏了堆的数据结构(缓冲区溢出、下溢、其他一些奇怪的魔法)。

尝试使用valgrind 调试您的程序(如果这是一个选项),或者如果不尝试隔离内存损坏的可疑代码并使用 valgrind 进行调试,那么您一定有一个错误会覆盖任何地方的一些重要数据结构。

入堆

为了解释这个奇怪的错误信息,这里有一些有趣的 ASCII 艺术

  • F:空闲块/字节
  • M : 内存管理结构

    FFFFFFFF

现在应用程序分配了两次内存(A 和 B)

我们得到类似的东西

AMBBBMFF

如果我们现在在内存中写

AMBBBMFF
 ^
here

我们破坏了堆的数据结构,因此 A 或 B 的校验和是错误的,因此它会发出错误消息。

【讨论】:

    【解决方案2】:

    谢谢大家,我找到了我的问题:

    其中一个算法要求有一个特殊的大小并且没有对其进行测试(这不是我自己的代码),所以它写出了数组。

    【讨论】:

      【解决方案3】:

      如果您的程序产生大量 malloc ,它可以重新限制为您的程序专用的内存。当您不再需要它时,您可能会释放内存。尝试增加程序内存限制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-17
        • 2020-02-11
        • 1970-01-01
        • 2011-12-27
        • 2022-09-24
        • 2011-09-03
        • 1970-01-01
        相关资源
        最近更新 更多