Форум: "Начинающим";
Текущий архив: 2012.03.11;
Скачать: [xml.tar.bz2];
ВнизОпределить, кто освобождает память Найти похожие ветки
← →
ProgRAMmer Dimonych © (2011-11-28 12:18) [0]Есть проект на D2007, из которого, выбирая ту или иную конфигурацию сборки, можно собрать 5 разных EXEшников. Я добавляю в проект кусок кода, обеспечивающий работу с ключом Guardant. После этого 4 из 5 приложений работают нормально, а 5-е начинает вылетать при завершении, когда завершается тело основной программы и начинает выполняться удаление форм.
В отладчике видно, что происходит AV при удалении одной из кнопок в панели инструментов: она в деструкторе обращается по адресу, хранящемуся в её поле, за 4мя байтами адреса ещё какой-то структуры, но эти байты оказываются затёртыми. Затираются они где-то в недрах деструктора формы, при вызове StrAlloc(). Отсюда я делаю вывод, что блок памяти, к которому пытается обращаться кнопка, уже кем-то освобождён.
Соответственно, нужно отловить место, где происходит освобождение памяти. Прошу совета: как это сделать наиболее просто и точно?
← →
OW © (2011-11-28 12:46) [1]бряк на память
← →
Rouse_ © (2011-11-28 12:47) [2]FastMM иногда показывает...
← →
Loginov Dmitry © (2011-11-28 22:14) [3]При добавлении в проект EXE новых форм они регистрируются в файле проекта *.dpr и автоматически создаются при запуске приложения. Проверь, нет ли в dpr чего лишнего.
Это лишь один из миллиона вариантов, в чем может быть проблема.
Проверяй все finalization, деструктор главной формы, если используются доп. потоки, проверяй код их завершения.
Если используются DLL, то это отдельная и очень длинная песня.
Если используется какой-то сторонний модуль для работы с Guardant, то, пожалуй, следует начать именно с него (ведь без него все работает?)
Отладка может выручить, но не факт.
← →
Rouse_ © (2011-11-28 23:07) [4]Да тут явно ни при чем ни библиотеки ни потоки ни прочее - на лицо банальная неаккуратная работа с памятью, что явно показывает реюз блока при StrAlloc
← →
Loginov Dmitry © (2011-11-28 23:31) [5]Ну так ведь и я про то же!)
Автору лишь осталось найти то самое место.
← →
Германн © (2011-11-29 00:10) [6]
> а 5-е начинает вылетать при завершении, когда завершается
> тело основной программы и начинает выполняться удаление
> форм.
"Вылет при завершении". Это мне не совсем понятный термин. "Вылететь" может работающая программа из-за некоей ошибки. Тогда она прекращает из-за этого свою работу.
"AV при завершении". Это мне знакомо. Сталкивался в своей программе. Избавился от него тем, что при завершении программы сначала остановил таймер. :)
P.S. Это так. Информация к размышлению.
← →
Loginov Dmitry © (2011-11-29 00:14) [7]вот, уже второй вариант. Осталось 999998 ;)
← →
ProgRAMmer Dimonych © (2011-11-29 01:30) [8]Спасибо за идеи, предложения и предположения. Завтра (ой, уже сегодня) буду проверять.
Добавляемый код - чисто свой, проверялся отдельно на тестовом приложении, очень долго и жестоко. Вылетает главный поток, вспомогательные завершаются корректно. DLL у разработчиков защищаемого продукта, к сожалению, используются, да и вообще код, мягко говоря, грязноват и дурнопахнущ - так что остаётся надеяться, что ограничится какой-нибудь мелочью. Про таймеры как-то в голову не пришло, завтра "прогуглю" проект :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.03.11;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c