![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
makavelly |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 26.3.2008 Репутация: нет Всего: нет |
На c++ не пишу, но возникла необходимость. Допустим, есть такой код:
Как я понимаю, при возникновении исключительной ситуации (5-я строка), подчистить за собой не получится. Как обычно в c++ решают такие ситуации? Например, в Delphi это можно оформить как try - finally - end. Разместив удаление объекта в finally ... end можно получить почти 100% гарантию уничтожения объекта. И еще вопрос... Есть ли в MS VC Express 2008 какой-нибудь механизм, позволяющий отслеживать утечки памяти? |
|||
|
||||
Amp |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: нет Всего: 17 |
Создать объект на стэке, использовать умные указатели, измазать код в BOOST_SCOPE_EXIT/BOOST_SCOPE_EXIT_END и т.п.
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
RAII. тогда код записывается так:
|
|||
|
||||
makavelly |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 26.3.2008 Репутация: нет Всего: нет |
Я наслышан о boost - массивный инструмент, можно обойтись без него?
Почитал про RAII, возникло несколько вопросов. C++ поддерживает этот принцип? Хотелось бы еще уточнить по поводу области видимости. Пример функции (видел нечто подобное в чужом коде):
Получается, что когда заканчивается выполнение DoSomeProcessing() importer выходит из области видимости и ресурсы будут освобождены? Если эта функция будет вызвана повторно, мы будем иметь дело с новым объектом importer? А если DoSomeProcessing() будет принадлежать классу? Вопросы, конечно, кажутся наивными, но как по мне, C++ коварен. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Поддерживает. Из стандартных средств можно использовать std::auto_ptr применительно к данной ситуации shared_ptr - overkill ![]() Да. Без разницы. Это сообщение отредактировал(а) azesmcar - 9.4.2012, 21:08 |
|||
|
||||
makavelly |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 26.3.2008 Репутация: нет Всего: нет |
Благодарю за ответы, ситуация начинает понемногу проясняться.
Еще один вопрос. Допустим, я хочу, что бы объект класса MyImporter являлся членом моего класса, который осуществляет некоторые действия над ним. Я хочу, чтобы экземпляр MyImporter'a существовал все время жизни экземпляра класса-обертки. Как я понимаю, для этого следует прописать такое объявление в объявлении класса-обертки
В конструкторе:
В деструкторе:
|
||||||
|
|||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
makavelly
Можно и так
|
|||
|
||||
makavelly |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 26.3.2008 Репутация: нет Всего: нет |
Т.е. получается, сам факт объявления в классе
уже создает объект importer... и как я догадываюсь, во время создания экземпляра класса X. Следует ли отсюда, что при уничтожении экземпляра класса X автоматически будут освобождены ресурсы, выделенные под importer? |
||||||
|
|||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
ну да. скопеда достаточно. |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
makavelly, и ещё один момент. Если в заголовочный файл класса-обёртки включить объект MyImporter, а не указатель на него
то в этот же заголовочный файл придётся включить и h-ник с объявлением MyImporter (например "importer.h"). При включении h-ника класса-обёртки в нескольких cpp-шниках "importer.h" будет компилироваться несколько раз, что увеличивает время компиляции. Если же ты включишь в класс-обёртку указатель, то "importer.h" достаточно включить только в cpp-нике класса обёртки, а в h-нике предобъявить MyImporter
Это сообщение отредактировал(а) borisbn - 10.4.2012, 06:42 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
makavelly |
|
||||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 26.3.2008 Репутация: нет Всего: нет |
borisbn, я видел вот такую конструкцию в *.h:
Может это для таких случаев Хотелось бы еще уточнить. В некоторых исходниках можно встретить подобные объявления:
Достаточно часто такое встречается. Какая смысловая нагрузка у префикса "m"? |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Это для того, чтобы при множественном включении заголовочного файла не возникало ошибок компиляции. Еще часто используется #pragma once, который не стандартен, но тем не менее поддерживается очень многими компиляторами.
Указывает на то, что это member variable. Это так называемая венгерская нотация. Это сообщение отредактировал(а) azesmcar - 10.4.2012, 10:56 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
нет. если h-ник включен в двух разных единицах трансляции (проще - в 2-х cpp-шниках), то он будет компилироваться дважды, несмотря на эти, т.н. guard'ы. А эти guird'ы нужны, чтобы в такой ситуации
код из 1.h не повторялся. иначе получится 2 описания класса X. member of class -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
makavelly |
|
||||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 26.3.2008 Репутация: нет Всего: нет |
Еще один вопрос. Прект - dll. Есть экспортируемая функция, запускающая обработку некоторых данных. Необходимо вернуть из этой функции результат в виде кода ошибки (или ее отсутствия) и времени выполнения обработки. Т.е. получается что надо вернуть адрес структуры типа:
Вопрос: чревато ли возвращать адрес локальной переменной (меня это очень смущает)? Например:
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |