LINUX.ORG.RU
ФорумTalks

освобождение памяти

 


0

5

освобождаю массивы структур таким образом, появляется double free or corruption

struct list *d;
struct list *pt;
for ( int h = 0; h < height; h++ )
{
  for ( int w = 0; w < width; w++ )
  {
     pt = &total_list [ h ] [ w ];
     while ( pt )
     {
        d = pt;
        pt = pt->next;
        free ( d );
     }
  }
}

Перемещено tailgunner из development

используй asan или другие средства отладки памяти, пусть они ищут ошибку

mittorn ★★★★★
()

Какой тип total_list?

Может действительно один и тот же список (или подсписки) хранишь в двух разных ячейках матрицы?

ilammy ★★★
()
Ответ на: комментарий от ilovewindows

+1, ибо после освобождения указатель указывает всё туда же - а там уже ничего нету

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от beastie

Ну подразумевается что во время проверки будет сообщение что указатель уже 0, что-то не так с алгоритмом.

ilovewindows ★★★★★
()

А как они выделялись?

Соберите с -g и прогоните под valgrind.

anonymous
()
Ответ на: комментарий от ilovewindows

Хороший способ не понимать свой код

anonymous
()

Наверное у тебя shared data. Твой К.О.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Если человек захочет убиться, то он это полюбасу сделает. Тогда предлагаю сразу ломать за malloc и free руку, только функции одобренные РКН и стоматологической ассоциацией.

ilovewindows ★★★★★
()
Ответ на: комментарий от no-such-file

похоже Вам стоит дать медаль экстрасенса недели, похоже именно это и происходит у тс

Silerus ★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Насыпь printf-ов в программу, где выделяешь, где освобождаешь. Это типичная отладка, так ты сможешь сам найти причину ошибок. А то ты показываешь место где чистишь, но едрен батон - где тогда код выделения памяти?

I-Love-Microsoft ★★★★★
()

Вангую, что у тебя где-то пересекаются указатели.

Aswed ★★★★★
()

Приведи полный код что бы можно было сделать gcc -g test.c и тебе быстро скажут где у тебя ошибка, потому что она может быть в индексах и при выделении памяти и в структуре самой структуры. А так, в next у тебя лежит два указателя на одно и тоже, вот и всё.

Dron ★★★★★
()
Ответ на: комментарий от Dron

Вот могу только это привести, здесь как раз выделяется память. В каждую ячейку таблицы может еще поступить данные, поэтому нужно дойти в этом списке до конца, и там добавить данные, данные я не напишу, но то что нужно напишу. h и w разные значения каждый раз имеют, их значения участвуют в определении в какую ячейку добавить.

pt = &total_list [ y / h ] [ x / w ];
while ( pt->next ) pt = pt->next;
...
pt->next = calloc ( 1, sizeof ( struct list ) );

u0atgKIRznY5
() автор топика
Ответ на: комментарий от I-Love-Microsoft

а вот создание таблицы

struct list **total_list = calloc ( height, sizeof ( struct list ) );
for ( int i = 0; i < height; i++ )
{
  total_list[i] = calloc ( width, sizeof ( struct list ) );
}

u0atgKIRznY5
() автор топика
Ответ на: комментарий от I-Love-Microsoft

У меня есть на c++, я захотел переписать на си, плюс нужно было придумать кое что получше, и в си я это реализовал, только вот проблема то. Там еще проблема есть, я не пойму почему не правильно, когда как логично и правильно написано. Я на c++ тоже заменю кое что, чтобы соответсовало новому замыслу, но уверен, что будет нормально работать, а в си проблемы какие то. Пользуясь c++ понел некоторые удобства, но хочу сравнить программу, написанную на обоих языках. Весь код немогу привести, так как раскрою реализацию.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Весь код немогу привести, так как раскрою реализацию

И что? Сомневаюсь, что у тебя там NDA. В чём проблема выложить реализацию (чего?), если есть шанс, что данные портятся где-то в ней?

XMs ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

struct list **total_list = calloc ( height, sizeof ( struct list ) );

У тебя тут * не хватает внутри calloc. Ну и матрицы выделять лучше одним куском, если надо указатели на строки - их тоже можно втулить в одну аллокацию вместе с данными.

anonymous
()

valgrind. Я не понимаю почему никто не пытается сначала воспользоваться инструментами? Слишком сложно?

slapin ★★★★★
()
Ответ на: комментарий от slapin

valgrind. Я не понимаю почему никто не пытается сначала воспользоваться инструментами? Слишком сложно?

Еще можно добавить -fsanitize=address при сборке, что еще проще.

anonymous
()
Ответ на: комментарий от slapin

valgrind. Я не понимаю почему никто не пытается сначала воспользоваться инструментами? Слишком сложно?

Использовал, там вообще пишет что ошибка есть в том, что неправильное удаление free ( d ), представляешь? Хотя списки именно так и надо удалять.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от XMs

если есть шанс, что данные портятся где-то в ней?

Но как такое может быть, ведь я привел код где выделяется и работу со списком. Данные присваиваются, но они никак не могут повредить, по крайней мере я этого не вижу.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

По производительности (если, конечно, ты буст с культями не юзаешь) ничего не выиграешь. По понятности — да, на С код прекрасней. Но не всегда: если есть явная тяга к ООПщине, то вместо плюсерских классов полезет угребище вроде глиба!

anonymous
()
Ответ на: комментарий от u0atgKIRznY5

вот это какая-то дикая херня. ты выделил память под структуры, затем перетёр(!) выделенную память указателями на структуры. а потом, судя по другому посту, ты пытаешься обращаться по неправильным смещениям в этом бардаке.

Iron_Bug ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

звездочки не хватает:

struct list **total_list = calloc ( height, sizeof ( struct list *) );

anonymous
()
Ответ на: комментарий от Iron_Bug

В таблице, в каждой ячейке был список, который создавался по мере надобности, и туда записывались новые данные. Но я уже другим способом сделал. Только в новом способе есть еще ошибки. Но теперь вместо двумерного массива, одномерный. Теперь проблем нет с этим и работает нормально, и освобождается память без ошибок. Я все двумерным массивы перевел в одномерный.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Deleted

посмотрите на посты ТС - и вас станет ясно кто ТС

Silerus ★★★★
()
Ответ на: комментарий от Deleted

С проблемами в проприетарном коде — в Job

Мне ваша помощь не нужна.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

У меня есть на c++

не вздумай постить сюда.

anonymous
()
Ответ на: комментарий от u0atgKIRznY5

Чтобы видеть что все таки удобней и производительней.

Удобней - это готовые контейнеры в с++ из stl (ну или другой внешней либы, тут уже вкусовщина). Производительнее они же, ибо там уже учтены самые частые юзкейсы, написанны нормальные алгоритмы, аллокаторы и все такое прочее. Я допускаю, что могут быть случаи когда надо что-то больше чем контейнеры из stl, но ты же понимаешь, что ты на текущем уровне своего развития такое не осилишь?

А если это просто ради обучения, а не создания продукта, то таки послушай советы умных людей и начинай читать хорошие книжки. Там ты и примеры нормального кода найдешь и к хорошему приучишься. Лучше всего K&R для си и Страуструп для плюсов.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Лучше всего K&R для си и Страуструп для плюсов.

K&R читал, да и зачем ты советуешь это мне? для c++ читаю элджера.

то таки послушай советы умных людей

Какие советы?

Я допускаю, что могут быть случаи когда надо что-то больше чем контейнеры из stl

Ты допускаешь? Ты как вообще мой уровень развития представляешь? Что я не могу осилить то что ты выдумал? Ты даже не сказал что именно, а уже про развитие пишешь.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Dudraug

Лучше всего K&R для си и Страуструп для плюсов

Не надо, он уже Танненбаума до того начитался, что полез в ядро сисколы писать, будучи уверенным, что на kernel.org можно скачать целую ОС, „ядро находится в линуксе“©, что ядро — „это всего лишь каталог в линуксе, где находятся файлы с типичным функционалом“©, а дрова, менеджер памяти и прочее лежит отдельно от ядра. Тут чего полайтовее надо

XMs ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

K&R читал, да и зачем ты советуешь это мне?

Что-то не заметно. Перечиитай.

для c++ читаю элджера.

Выкинь каку. Ты специально что ли эту дичь выбрал? Чтобы НЕ научиться плюсам? Лучше страуструпа и cppreference.com ничего еще не придумали. Можно конечно Майерса и Александреску еще посмотреть, но тебе рано.

Какие советы?

Читать умные книжки.

Ты допускаешь? Ты как вообще мой уровень развития представляешь? Что я не могу осилить то что ты выдумал? Ты даже не сказал что именно, а уже про развитие пишешь.

Что ты несешь? Что я выдумал? Я сказал, что для реальных продуктов лучше брать готовые контейнеры. Написать что-то лучше них - это тяжелая задача даже для опытного программиста. А случаи, когда возникает необходимость в своих костылях не так часты и обычно связаны с особыми требованиями.

Вот скажи прямым текстом, чем тебя не устраивают стандартные контейнеры?

Я пожалуй таки спрошу, хотя наверное пожалею, о том каков твой уровень. Просвяти.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

ТС - не слушает никого и ничего, имеет крайне узкий кругозор, считает местный форум - как личное средство получение бесплатных подсказок - кого Вы лечите

Silerus ★★★★
()
Ответ на: комментарий от Dudraug

Вот скажи прямым текстом, чем тебя не устраивают стандартные контейнеры?

Контейнеры нормально. Но в си я структуры пишу, поэтому не пойму что ты тут мне про контейнеры пишешь. Код, который на с++ с контейнерами сделан. Я на си кое-что новое внес, и в c++ сделаю некоторые изменения.

Написать что-то лучше них - это тяжелая задача даже для опытного программиста.

Иногда контейнера с шаблоном не работает как нужно. И писал свой, который работал. Незнаю какой там функционал у того контейнера, но по сравнению с ним, у меня было всего лишь два нужных метода.

Я пожалуй таки спрошу, хотя наверное пожалею, о том каков твой уровень. Просвяти.

А есть тест какой нибудь? Я на geekgrains не на все вопросы правильные ответы дал. А еще я не учился в универе, поэтому знаю только то, до чего додумался или высмотрел в исходных кодах других программ.

Выкинь каку. Ты специально что ли эту дичь выбрал?

Зачем мне тебя слушать? Я их все равно все перечитаю. А книгу которую я читаю советовал автор, которого я уже не помню как зовут, а скляров.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Контейнеры нормально. Но в си я структуры пишу, поэтому не пойму что ты тут мне про контейнеры пишешь. Код, который на с++ с контейнерами сделан. Я на си кое-что новое внес, и в c++ сделаю некоторые изменения.

Во-первых, переписывать что-то написанное на с++ на си - это верх идиотизма. Серьезно. Во-вторых контейнеры готовые есть и для чистого си - гугл тебе в помощь.

Иногда контейнера с шаблоном не работает как нужно.

Это как? Можно примеры? Мне кажется, что ты просто не разобрался с ними.

Незнаю какой там функционал у того контейнера, но по сравнению с ним, у меня было всего лишь два нужных метода.

Ты ж знаешь что такое аллокаторы? Сможешь ли ты сам написать максиально эффективный контейнер, которые оптимально работает с памятью? Ты ж любитель быстрого, ты должен стремиться к эффективным решениям.

Зачем мне тебя слушать? Я их все равно все перечитаю. А книгу которую я читаю советовал автор, которого я уже не помню как зовут, а скляров.

Может меня (как и других) стоит слушать потому что я у меня многолетний опыт работы программистом? А у многих других людей, которые пытаются до тебя хоть что-то донести, еще больше чем у меня. Тебе дают дельные советы, но ты их отвергаешь. Качество твоего кода довольно хреновое. Да даже не в качестве кода дела - у тебя отсутствиет понимание того, что ты делаешь и как это все работает. А это еще хуже чем говнокод. Лучше одумайся и начинай изучать вопрос.

А есть тест какой нибудь? Я на geekgrains не на все вопросы правильные ответы дал. А еще я не учился в универе, поэтому знаю только то, до чего додумался или высмотрел в исходных кодах других программ.

При чем тут тесты? Тебе люди с опытом говорят, что твой уровень не очень. И дают тебе советы как его изменить и указывают на то, что ты делаешь не так. А ты их не слушаешь. И главная проблема не в том, что ты фигню пишешь, а в том, что ты не воспринимаешь критику от слова вообще. Ты не осознаешь, что ты делаешь фигню и не пытаешься обучиться, изменить свой уровень. Ты уверен, что ты все делаешь правильно. И в этом ошибка.

Dudraug ★★★★★
()
Ответ на: комментарий от XMs

Ну ты же только из-за ядра можешь назвать линукс линуксом, значит ядро и есть линукс.

Да и начни уже читать что нибудь подходящее, где я правильней излагаю. Вот пример из книги, которую столяров написал, смотри и учись что мужик пишет.

В предыдущих томах нашей книги под «ос» всегда понималась именно та программа, которая загружается первой о осуществляет работу с аппаратурой, обрабатывает прерывания и обслуживает системные вызовы. Эту программу также называют ядром операционной системы.

А большой набор программ будем называть как диструбутив и окружение.

Так что хватит тролить незнайка.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

А книгу которую я читаю советовал автор

Страуструп - создатель с++, у него очень граматная книга описывающая концепцию языка, его подводные камни и способы првильно использовать язык. У него есть издание под с++11/14. А ты приводишь книгу о которой никто толком и не слышал никогда. Как думаешь почему?

Dudraug ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Что ты несешь? Окей, вопрос такой, что такое ядро системы? А конкретно линукс, что в него входит? Проверим твои знания=)

Dudraug ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.