Выделение уже выделенной памяти

Я разрабатываю приложение Objective-C (iOS), которое использует массивы очень большого размера (размер> 10 000) в части приложения, основанной на C.

В момент выполнения я делаю 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 пытается выделить уже использованную память?

Любая помощь приветствуется :)

Спасибо !


person Apollo    schedule 08.04.2013    source источник
comment
iOS не пытается выделить используемую память. В вашем коде будет ошибка, вызывающая эту ошибку. Можете ли вы создать минимальный тестовый пример и отредактировать свой вопрос, чтобы включить этот код, пожалуйста?   -  person simonc    schedule 08.04.2013
comment
Как вы создаете свой массив?   -  person Stephen Darlington    schedule 08.04.2013
comment
Что сказал Стивен; Я готов поспорить на доллар, что вы выходите за пределы массива.   -  person bbum    schedule 08.04.2013


Ответы (3)


  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 неверна, поэтому выдается сообщение об ошибке.

person Quonux    schedule 08.04.2013

Спасибо всем, я нашел свою проблему:

Один из алгоритмов попросил указать особый размер и не тестировал его (это не мой собственный код), поэтому он был записан из массива.

person Apollo    schedule 09.04.2013

если ваша программа делает много malloc, она может повторно увеличить лимит памяти, выделенной для вашей программы. Возможно, вы освободите память, когда она вам больше не понадобится. Попробуйте увеличить лимит памяти для вашей программы.

person user2254860    schedule 08.04.2013