Re: Resource Acquisition Is Initialization
От: Шебеко Евгений  
Дата: 18.09.12 10:54
Оценка:
здесь

Старайтесь избегать в коде явного освобождения ресурсов.
Причины для этого такие:
— Вы можете выйти из области видимости (например, return посреди функции), забыв освободить ресурс.
— В функции или в вызываемых функциях может произойти исключение.
Поэтому либо ресурс останется неосвобождённым, либо придётся расставлять try\catch после каждой инициализации ресурсов в функции.


//Пример    автоматического вызова fclose()
class file_hldr
{
    file_hldr(const file_hldr&);
    void operator=(const file_hldr&);
public:
    FILE* f;
    file_hldr(FILE* _f) {f=_f;}
    ~file_hldr(){if(f)fclose(f);}
};

//Использовать так:
void foo()
{
    FILE* f=fopen("data.txt","rb");
    file_hldr fh(f);//С этого момента, чтобы не случилось для f будет вызван fclose()
    ...
}


Для динамических объектов можно использовать смарт указатели. Например: shared_ptr (boost::shared_ptr, std::shared_ptr) или std::auto_ptr
Предпочтительнее использовать shared_ptr<>, т.к. внутри него есть счётчик ссылок, что позволяет его безопасно копировать и хранить в контейнерах.
Для строк std::string или тот класс строк, который использует ваш фреймворк. CString, например.
Для массивов, с некоторыми оговорками, можно использовать std::vector<>. Даже в том случае, когда нужно получить прямой указатель на массив объектов.
Для остальных ресурсов, часто фреймворк, который вы используете, уже предоставляет классы-обёртки. Поищите их и пользуйтесь. Например, CFile,CPen,CBrush, CDC и т.д.
Для ваших собственных ресурсов вполне можно написать такую же поделку, как я привёл выше.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.