Я прочитал статью о защитных планах (Generic: Change the Way You Write Exception-Safe Code — Forever) в DDJ, и я понимаю их общее использование.Динамически создаваемые защитные зоны
Однако общее использование для создания экземпляра конкретного стека охранника в стеке для конкретной операции, например .:
{
FILE* topSecret = fopen("cia.txt");
ON_BLOCK_EXIT(std::fclose, topSecret);
... use topSecret ...
} // topSecret automagically closed
, но что, если я хочу, чтобы запланировать очистки операции во время выполнения, например, когда у меня есть цикл:
{
vector<FILE*> topSecretFiles;
for (int i=0; i<numberOfFiles; ++i)
{
char filename[256];
sprintf(filename, "cia%d.txt", i);
FILE* topSecret = fopen(filename);
topSecretFiles.push_back(topSecret);
ON_BLOCK_EXIT(std::fclose, topSecret); // no good
}
}
Очевидно, что приведенный выше пример не будет работать, так как topSecret
будет закрыт вместе с для сферы. Мне нужен шаблон защиты области, где я могу так же легко выполнять операции по очистке очереди, которые, как я определяю, необходимо, во время выполнения. Есть ли что-то подобное?
Я не могу передать объекты защиты объекта в стандартную очередь, потому что исходный объект (тот, который я нажимаю) будет отклонен в процессе. Как насчет того, чтобы нажимать кучи-выделенные стеки и использовать очередь, которая удаляет ее члены на dtor? У кого-нибудь есть более умный подход?
Да, вы правы, что RAII предпочтительнее для деструктора ресурса (например, дескриптора файла). Я использую только защитные оболочки для вещей, которые было бы неудобно представлять в качестве «ресурса», например. отчет (OperationStart); ON_BLOCK_EXIT (отчет, OperationEnd); doSomething(); – Ilya
К сожалению, у меня еще нет TR1 в моем компиляторе, поэтому я не могу использовать shared_ptr. Тем не менее, вектор/очередь auto_ptr может просто работать (предполагая, что я бы купил выделение границ области и нажал их в вектор/очередь). Я заинтригован, узнав, что некоторые классы C++ станут «подвижными» (не знали об этой терминологии). Это делается с пересчетами? Может быть, я должен сделать так, чтобы охранники были «подвижными»? –
Ilya
Вектор/очередь auto_ptr <...> явно не очень хорошая идея, так как auto_ptrs не копируются! –