Не пойму - чего он память не хочет освободить?
От: Аноним  
Дата: 24.05.04 10:13
Оценка:
При запуске прилолжения выделяю память — через 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.

А>Что бы это значило?

Вот сейчас зашел в ассемблерный листинг при дебаге Вот:

CMyClass::`scalar deleting destructor'+41h (4C3E31h) 
004C3E25  mov         eax,dword ptr [this] 
004C3E28  push        eax  
004C3E29  call        operator delete (4AFB31h)


Вылетает на последней строчке. Помогите, что это?
Re: Не пойму - чего он память не хочет освободить?
От: Вадим Никулин Россия Здесь
Дата: 24.05.04 10:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>При запуске прилолжения выделяю память — через 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]: Не пойму - чего он память не хочет освободить?
От: Вадим Никулин Россия Здесь
Дата: 24.05.04 10:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Вадим Никулин, Вы писали:


ВН>>Скорее всего, у тебя 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]: Не пойму - чего он память не хочет освободить?
От: Вадим Никулин Россия Здесь
Дата: 24.05.04 11:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Вадим Никулин, Вы писали:


ВН>>Когда ты якобы из приложения удаляешь объект, delete все-равно зовется из dll. Во всяком случае, в VC7.1. Проверь, везде ли MDd выставлен?


А>Так в том-то и дело, что и у приложения и у DLL этот флаг выставлен


Варианта 3:

1. Еще раз проверить
2. Поставить Rational purify, и посмотреть, что он скажет.
3. Поколдовать над отладчиком.

Удачи!
Re: Не пойму - чего он память не хочет освободить?
От: WolfHound  
Дата: 24.05.04 11:41
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Что бы это значило?

Скорей всего пишешь за приделы массива.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Не пойму - чего он память не хочет освободить?
От: Аноним  
Дата: 24.05.04 11:49
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, <Аноним>, Вы писали:


А>>Что бы это значило?

WH>Скорей всего пишешь за приделы массива.

Он вылетает в scalar deleting destructor. Скажите, что это за зверь?
Re: Не пойму - чего он память не хочет освободить?
От: degor Россия  
Дата: 24.05.04 12:08
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>При запуске прилолжения выделяю память — через 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: Не пойму - чего он память не хочет освободить?
От: Аноним  
Дата: 24.05.04 12:28
Оценка:
А если я из DLL возвращаю структуру типа

typedef  struct 
{
    LPSTR   plugin_type;
    CString menu_string;
    bool    show_after_load;
} PLUGIN_INFO;

Надо что-нибудь где-нибудь делать по освобождению этих строк?
Re[2]: Не пойму - чего он память не хочет освободить?
От: ccpp  
Дата: 25.05.04 13:44
Оценка:
На самом деле такая проблема может возникнуть из-за разрушения кучи, причём не обязательно в момент вызова этого delete или предыдущего, а в т.ч. и гораздо раньше. Ну а куча может быть разрушена из-за попыток записи за границы массива. В любом случае отловить подобное очень непросто...
Или ещё один вариант — удаление указателя, который уже был удалён до этого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.