Есть много разных схем, которые люди использовали на протяжении многих лет, некоторые лучше или хуже. Хорошие стратегии определяют жесткую и последовательную модель, которая устанавливает правила «владения» ресурсом, то есть ответственность за очистку и обеспечение того, чтобы никто не имел нелегального доступа к ресурсу. Правила успешных стратегий также таковы, что для безопасного доступа к ресурсу необходимо только локальное представление о ресурсе и о том, как он используется.
Стратегия, которую вы должны использовать в современном C++, называется RAII, или «приобретение ресурсов — это инициализация». Это имя означает, что любой полученный ресурс должен быть инициализацией. Например:
std::string s = "Hello, World";
Этот код получает некоторый объем памяти в качестве ресурса для хранения строковых данных, но вы видите только то, что строка инициализирована. Инициализируемый объект владеет памятью. Это означает, что он отвечает за управление временем жизни памяти и ограничение доступа к ней. Код, использующий объект, вообще не должен учитывать ресурс. Нужно только убедиться, что он правильно использует сам объект, и время жизни скрытого ресурса, в свою очередь, будет корректно управляться.
Использование RAII не только удобно для локализации нормального управления ресурсом, но и значительно упрощает правильную очистку ресурсов при наличии исключений. Когда область выходит из-за исключения, C++ гарантирует уничтожение всех полностью созданных объектов в этой области. Если необходимые задачи по очистке ресурсов выполняются деструкторами объектов, то утечки ресурсов не будет, и нет необходимости добавлять явную обработку исключений в каждую область, в которой используется ресурс.
C++ уже включает классы, владеющие ресурсами, для многих типов ресурсов. Для массива с динамическим размером используйте std::vector
:
std::vector<CString> xyz()
{
// C++11
return {"hello",...};
// or C++03
std::vector<CString> mappings;
mappings.push_back("hello");
...
return mappings
}
void main(int argc, char **argv)
{
std::vector<CString> tmp = xyz();
// now we have the CString array defined in xyz
// the array gets automatically cleaned up by std::vector's destructor
}
person
bames53
schedule
14.03.2012
std::vector
. - person Cat Plus Plus   schedule 14.03.2012