2011-01-22 4 views
5

Я ищу способ быстро выйти из C++, который выделил много структур в памяти с использованием классов C++. Программа завершается корректно, но после окончательного «возврата» в программе все автодеструкторы выходят. Проблема заключается в том, что программа выделила около 15 ГБ памяти через множество структур класса C++, и этот процесс автоматического уничтожения около 1 часа, чтобы закончить, когда он проходит через все структуры - хотя я не забочусь о результатах. Программе потребовалось всего 1 час, чтобы завершить задачу до этого момента. Я хотел бы просто вернуться в ОС и позволить ему выполнять обычное опционное удаление выделения процесса - это очень быстро. Я делаю это, вручную убивая процесс во время этапа очистки - но я ищу лучшее программное решение.Быстрый успешный выход из C++ с большим количеством выделенных объектов

Я хотел бы вернуть успех ОС, но не хочу сохранять содержимое памяти. В ходе нормальной обработки программа выполняет много динамического распределения/освобождения, поэтому это не просто управление кучей.

Любые мнения?

+6

Это просто не может пройти один час, если вы ничего не делаете в деструкторе. Должно быть что-то, что его блокирует. Вы пробовали профилировать его? – Naveen

ответ

1

Если 15 ГБ памяти выделяется достаточно маленькому числу классов, вы можете переопределить удаление оператора для этих классов. Просто передайте вызов стандартного удаления, но настройте глобальный флаг, который, если он установлен, заставит вызов удалить no-op. Или, если логика вашей программы такова, что эти объекты не удаляются при нормальном ходе построения ваших структур данных, вы можете просто игнорировать удаление во всех случаях для этих классов.

1

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

4

В стандартном C++ у вас есть только abort(), но у него есть отказ процесса для ОС.

На многих платформах (Unix, MS Windows) вы можете использовать _exit() для выхода из программы без запуска очистки и деструкторов.

+0

_exit() ничего не говорит о деструкторах, поскольку это функция POSIX (ничего не рассказывающая о C++). В настоящее время он не вызывает никаких деструкторов на платформе, которые у меня есть, но это не гарантируется документацией. –

+0

Вот почему я сказал, что это работает на конкретных платформах. Но, как обсуждалось на http://stackoverflow.com/q/4769229/585729, это должно быть на любой платформе, где она существует. – JoergB

1

Если у вас есть компилятор C99, вы можете использовать функцию _Exit для немедленного завершения без наличия глобальных объектов-деструкторов или любых функций, зарегистрированных с помощью atexit; независимо от того, были ли сброшены неписанные данные в буферизованных файлах, открытые потоки закрыты или временные файлы удалены, определяется реализацией (C99 §7.20.4.4).

Если вы используете Windows, вы также можете использовать ExitProcess для достижения такого же эффекта.

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

1

Возможные стратегии зависят от количества объектов, которые непосредственно видны в main, через которые вы получаете доступ к 15 ГБ данных, и если они локальны для основного или статически выделенного.

Если все доступ к 15GB данных через локальные объекты в main, то вы можете просто заменить return 0; в конце main с exit(0);.
exit прекратит ваше приложение и инициирует очистку статически назначенных переменных, но не локальных переменных.

Если доступ к данным осуществляется с помощью нескольких статически распределенных переменных, вы можете превратить их в указатели (или ссылки) в динамически распределенную память и намеренно протечьте это.

2

C++ 0x std::quick_exit - это то, что вы ищете, если ваш компилятор уже поддерживает его (g ++ - 4.4.5).

Смежные вопросы