![]() |
|
|
![]()
|
|
| stmamont |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 343 Регистрация: 13.3.2004 Где: влг Репутация: 3 Всего: 3 |
Возможно глупый вопрос, но ума не приложу куда смотреть!
Программа выполняет долгую работу, (несколько суток). И вот на 5 часу работы она странно завершила работу. т.е. не выдала никакой ошибки , ничего, просто завершилась. Приложение многооконное, программа выключается при закрытии всех окон. Я с ней ничего не делал. за памятью следил (в списке процессов смотрел сколько памяти ест, на момент закрытия было порядка 20 Мб). Компьютер мощный. ПО-моему, ошибка во всяком случае должна была выскочить. Не подскажете что могло произойти? |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
посмотри в EventLog. в серверных виндах галка "уведомлять о сбоях" снята по умолчанию, так что падающее приложение только пишет в лог "ватсона" и в EventLog.
если нет, то вставляй подробный логгинг, отлаживайся. |
|||
|
||||
| stmamont |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 343 Регистрация: 13.3.2004 Где: влг Репутация: 3 Всего: 3 |
то есть такое возможно? что бы программа закрылась без ошибок? хотя в ней кода даже такого нету. (чтобы закрывалась?)
|
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
В винде свойство такое есть, закрывать зависшие процессы. А насчет твоей программы, здесь не телепаты, что бы судить, правильно у тебя написано программа или нет, может она 5 часов работает, а потом вызывает какую нибудь инструкцию, которая неправильно выделяет память и все - кирдык, винда такого не простит
Что бы знать где программа выскочила, делай логи, то есть после определенных функций или команд пиши время и действие в файл, а потом просматривай логи. -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| stmamont |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 343 Регистрация: 13.3.2004 Где: влг Репутация: 3 Всего: 3 |
>>может она 5 часов работает, а потом вызывает какую нибудь инструкцию, которая неправильно выделяет память и все - кирдык, винда такого не простит
Очень похоже на это. работает около 3 часов, перелопатила 5000 элементов. После чего Access Violation at address 0000000032 . Т.е. я похоже пытался создать объект при помощи new но винда память не выделила, и я без проверки полез к какоу то элементу. Почему такое может произойти? На момент ошибки программа весит в оперативке 20Мб. Что вполне адекватно информации которую она хранит, т.е. утечек памяти быть не должно. (В пред версии была утечка, программа вылетела при размере 300Мб)))) Почему система может не выделить память? и занулит ли она указатель , если не смогла выделить память? |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
единственный вопрос, на который можно ответить. занулит. чаще всего такое бывает при вызове метода несуществующего объекта. может помочь - madExcept |
|||
|
||||
| Bima |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Опять те же грабли.
МЫ здесь не телепаты, что бы обсуждать гипотетический код на предмет ошибки.
если ты в цикле постоянно создаешь элементы и их удаляешь, то это не есть ГУД. Попробуй их создать при создании формы, а удалять в конце программы. Конечно я предвижу вопрос, что всякое может понадобиться в момент исполнения программы, и программа должна все выполнить, но создание элементов с помощью new не дает гарантии, что он создался ( если быть точне я не помню, как проверить создание данного элемента), в отличии от "сишного" оператора выделения памяти (типа allocmem) у которого можно проверить выделилась память или нет. Для примера код:
Я взял подпрограмму для выделения памяти, которую писал лет 5 назад. Сам алгоритм не важен, а важно, как идет выделение памяти и проверка выделения памяти. Анологично должно быть и в твоей программе. -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||
|
|||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Почему нельзя проверить? Вот что пишет тот же HELP Buildera:
По умолчанию, при ошибки выделении памяти new вылетает исключение Если использовать форму new(nothrow) - то исключения не будет, а при ошибке вернет NULL Кстати: я точно не проверял, но по-моему Builder по умолчанию делает как раз nothrow - т.е. без исключения, но я точно не помню. |
|||
|
||||
| Vyacheslav |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Bulder придерживается стандарта и соответсвенно форма new при ошибке выделения памяти генерит исключение. Ладно я, еще успел поработать на компиляторах "достандартной" эпохи, но сейчас то .... Тем не менее на собеседовании при приеме на работу 50 процетов кандидатов не видят в ниже следующем коде ничего криминального
Более того. Когда явно указываешь им на бессмысленность проверки, уверяют что ВСЕ И ВСЕГДА ТАК ДЕЛАЮТ. Добавлено @ 11:47
Этого не может быть, потому что быть не может. Если конечно Вы не промаскировали возникшее при этом исключение. Скорее всего, Вы обратили к объекту, который уже уничтожили или еще не создали -------------------- С уважением, Вячеслав Ермолаев |
||||||
|
|||||||
| stmamont |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 343 Регистрация: 13.3.2004 Где: влг Репутация: 3 Всего: 3 |
Ясно, спасибо. Теперь буду отлавливать все выделения памяти и обращения к нулевым указателямю
|
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Vyacheslav поясни свой код:
Насколько я понимаю, здесь выделяется массив размерностью size и указатель pchar указывает на этот массив. Всегда не в ладах был с этими указателями, поэтому хочу поточнее уловить этот момент. Я не знаю, что возвращает в данном случае операция new char[size], но по логике эта операция может вернуть адрес на первый элемент массива и он не будет равен 0. Или я не прав??? -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| stmamont |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 343 Регистрация: 13.3.2004 Где: влг Репутация: 3 Всего: 3 |
смысл такой: оператор new выкидывает exception если система не смогла выделить память. И соответственно до второй строчки работа программы не дойдет.
А в если все пройдет нормально, то оператор new вернет указатель на первый элемент массива char размера size и проверка тем более не нужна. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
stmamont прекрасно все разъяснил без меня -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
теперь понял, спасибо
-------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Sfairet |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 11.1.2007 Репутация: нет Всего: нет |
По моему вариант с нулём не такой уж и безнадежный, во первых старые версии new возвращают именно 0 (до принятия стандарта), к томуже не каждый компилятор согласиться генерировать исключение bad_alloc, а также просто будет использовать вариант с 0
|
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |