Как использовать std :: auto_ptr в качестве параметра функции?

Мне нужно использовать 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)
}

Или, может быть, я сам освобождаю память вместо использования умных указателей? Если так, как это сделать? Заранее спасибо.

3

Решение

Просто не используйте указатели, даже умные в этом случае:

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. Избегайте указателей, когда вы можете.

4

Другие решения

Если у вас есть функция, которая принимает 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 отказаться от контроля над ресурсом, и нет никаких «уловок!» — стиль удивляет этим.

Надеюсь это поможет!

4