0

我正在开发一个 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 会尝试分配已使用的内存?

欢迎任何帮助:)

谢谢 !

4

3 回答 3

0
  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 的校验和是错误的,因此它会发出错误消息。

于 2013-04-08T12:01:09.977 回答
0

谢谢大家,我发现了我的问题:

其中一种算法要求具有特殊大小并且没有对其进行测试(这不是我自己的代码),因此它从数组中写入。

于 2013-04-09T15:37:45.163 回答
-2

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

于 2013-04-08T10:59:45.490 回答