Мне нужно использовать RAII идиома, я делаю это правильно?
std::auto_ptr<std::vector<string>> MyFunction1()
{
std::auto_ptr<std::vector<string>> arrayOfStrings;
MyFunction2(arrayOfStrings); // work with arrayOfStrings
return arrayOfStrings;
}
void MyFunction2(std::auto_ptr<std::vector<string>> array)
{
auto_ptr<string> str;
*str = "foo string";
array.push_back(str)
}
Или, может быть, я сам освобождаю память вместо использования умных указателей? Если так, как это сделать? Заранее спасибо.
Просто не используйте указатели, даже умные в этом случае:
std::vector<string> MyFunction1()
{
std::vector<string> arrayOfStrings;
MyFunction2(arrayOfStrings); // work with arrayOfStrings
return arrayOfStrings;
}
void MyFunction2(std::vector<string> &array)
{
array.push_back("foo string");
}
Компилятор обязательно оптимизирует копию возвращаемого значения, применяя оптимизацию под названием Оптимизация возвращаемого значения, так что тебе не стоит об этом беспокоиться. Использование указателей, в этом случае, чтобы избежать копирования, вероятно, в конечном итоге станет более неэффективным и утомительным для работы по сравнению с использованием объектов, размещенных в стеке, и использованием этой оптимизации.
В противном случае рассмотрите возможность использования std::unique_ptr
как упоминает @templatetypedef. Избегайте указателей, когда вы можете.
Если у вас есть функция, которая принимает std::auto_ptr
по значению, то что угодно std::auto_ptr
то, что вы перейдете к этой функции, откажется от управления ресурсом и передаст его вызываемой функции. В результате, когда функция возвращается, оригинал std::auto_ptr
больше не будет указывать на ресурс, на который он первоначально указывал. В результате вы можете подумать о std::auto_ptr
по значению, говоря: «Я собираюсь забрать у вас ваш ресурс и что-то с ним сделать».
Чтобы это исправить, подумайте, чтобы ваша функция std::auto_ptr
по ссылке, которая не крадет ссылку.
Но, тем не менее, вы должны прекратить использование std::auto_ptr
и начать использовать std::unique_ptr
вместо. std::unique_ptr
является гораздо более безопасной и более вменяемой заменой std::auto_ptr
, Вы не можете пройти std::unique_ptr
по значению без явного использования std::move
отказаться от контроля над ресурсом, и нет никаких «уловок!» — стиль удивляет этим.
Надеюсь это поможет!