При запуске прилолжения выделяю память — через new. При выходе из приложения — хочу освободить — через delete. А он вылетает в _free_base с руганью — Unhandled exception at 0x77f75a58 in MyApp.exe: User breakpoint.
Что бы это значило?
Re: Не пойму - чего он память не хочет освободить?
От:
Аноним
Дата:
24.05.04 10:20
Оценка:
А>Что бы это значило?
Наверное, что-то нехорошее ?
Re: Не пойму - чего он память не хочет освободить?
От:
Аноним
Дата:
24.05.04 10:23
Оценка:
Здравствуйте, Аноним, Вы писали:
А>При запуске прилолжения выделяю память — через new. При выходе из приложения — хочу освободить — через delete. А он вылетает в _free_base с руганью — Unhandled exception at 0x77f75a58 in MyApp.exe: User breakpoint. А>Что бы это значило?
Вот сейчас зашел в ассемблерный листинг при дебаге Вот:
Здравствуйте, Аноним, Вы писали:
А>При запуске прилолжения выделяю память — через new. При выходе из приложения — хочу освободить — через delete. А он вылетает в _free_base с руганью — Unhandled exception at 0x77f75a58 in MyApp.exe: User breakpoint. А>Что бы это значило?
Скорее всего, у тебя exe/dll. При этом память выделяется в exe, убивается в dll. Нужно либо выделять память в dll (типа, метод-фабрика), либо поставить "Runtime library: Multi-threaded Debug DLL (/MDd)"
Re[2]: Не пойму - чего он память не хочет освободить?
От:
Аноним
Дата:
24.05.04 10:38
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:
ВН>Скорее всего, у тебя exe/dll. При этом память выделяется в exe, убивается в dll. Нужно либо выделять память в dll (типа, метод-фабрика), либо поставить "Runtime library: Multi-threaded Debug DLL (/MDd)"
Да, exe/dll. НО: MDd уже выставлено, и память под эти объекты я выделяю и освобождаю в приложении, а не в DLL. Но тогда вотпрос — у меня в DLL есть статические переменные (я их создаю не динамически). Может ли их освобождение давать сбой?
Re[3]: Не пойму - чего он память не хочет освободить?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Вадим Никулин, Вы писали:
ВН>>Скорее всего, у тебя exe/dll. При этом память выделяется в exe, убивается в dll. Нужно либо выделять память в dll (типа, метод-фабрика), либо поставить "Runtime library: Multi-threaded Debug DLL (/MDd)"
А>Да, exe/dll. НО: MDd уже выставлено, и память под эти объекты я выделяю и освобождаю в приложении, а не в DLL. Но тогда вотпрос — у меня в DLL есть статические переменные (я их создаю не динамически). Может ли их освобождение давать сбой?
Когда ты якобы из приложения удаляешь объект, delete все-равно зовется из dll. Во всяком случае, в VC7.1. Проверь, везде ли MDd выставлен?
Re[4]: Не пойму - чего он память не хочет освободить?
От:
Аноним
Дата:
24.05.04 11:03
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:
ВН>Когда ты якобы из приложения удаляешь объект, delete все-равно зовется из dll. Во всяком случае, в VC7.1. Проверь, везде ли MDd выставлен?
Так в том-то и дело, что и у приложения и у DLL этот флаг выставлен
Re[4]: Не пойму - чего он память не хочет освободить?
От:
Аноним
Дата:
24.05.04 11:17
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:
ВН>Когда ты якобы из приложения удаляешь объект, delete все-равно зовется из dll. Во всяком случае, в VC7.1. Проверь, везде ли MDd выставлен?
Вот в сообщениях TRACE выкопал следующее
Free Heap block 30eaeb8 modified at 30eb858 after it was freed
Это что значит? Я меняю что-то после того как освободил? А когда такое может произойти (явно я этого точно не делаю)?
Re[5]: Не пойму - чего он память не хочет освободить?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Вадим Никулин, Вы писали:
ВН>>Когда ты якобы из приложения удаляешь объект, delete все-равно зовется из dll. Во всяком случае, в VC7.1. Проверь, везде ли MDd выставлен?
А>Так в том-то и дело, что и у приложения и у DLL этот флаг выставлен
Варианта 3:
1. Еще раз проверить
2. Поставить Rational purify, и посмотреть, что он скажет.
3. Поколдовать над отладчиком.
Удачи!
Re: Не пойму - чего он память не хочет освободить?
Здравствуйте, <Аноним>, Вы писали:
А>При запуске прилолжения выделяю память — через new. При выходе из приложения — хочу освободить — через delete. А он вылетает в _free_base с руганью — Unhandled exception at 0x77f75a58 in MyApp.exe: User breakpoint. А>Что бы это значило?
User breakpoint это скорей всего ASSERT в недрах CRTL. Если бы у тебя были поставлены ее исходники, ты бы увидел где.
А>Free Heap block 30eaeb8 modified at 30eb858 after it was freed А>Это что значит? Я меняю что-то после того как освободил? А когда такое может произойти (явно я этого точно не делаю)?
Ну явно, конечно, не делаешь. А вот промахнуться с индексом массива или записать что-то в уже удаленный объект ты мог.
И еще посмотри, на что указывает твой указатель. Если там dddddd, то объект уже убился.
... << RSDN@Home 1.1.3 stable >>
Re: Не пойму - чего он память не хочет освободить?
На самом деле такая проблема может возникнуть из-за разрушения кучи, причём не обязательно в момент вызова этого delete или предыдущего, а в т.ч. и гораздо раньше. Ну а куча может быть разрушена из-за попыток записи за границы массива. В любом случае отловить подобное очень непросто...
Или ещё один вариант — удаление указателя, который уже был удалён до этого.