3

我需要使用 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)
}

或者也许我应该自己释放内存而不是使用智能指针?如果是这样,该怎么做?提前致谢。

4

2 回答 2

4

如果您有一个std::auto_ptr按值获取的函数,那么std::auto_ptr您传递给该函数的任何内容都将放弃对资源的控制并将其交给它调用的函数。结果,当函数返回时,原来的std::auto_ptr将不再指向它原来指向的资源。因此,您可以std::auto_ptr将按值接收视为说“我将把你的资源从你手中夺走并用它做点什么”。

要解决此问题,请考虑让您的函数采用std::auto_ptr引用,这不会窃取引用。

但话虽如此,您应该停止使用std::auto_ptr并开始使用std::unique_ptrstd::unique_ptr是一个更安全、更理智的替代品std::auto_ptrstd::unique_ptr如果不明确地使用来放弃对资源的控制,就不能通过值传递std::move,并且没有任何“陷阱!”风格的惊喜。

希望这可以帮助!

于 2012-12-24T22:10:06.733 回答
4

只是不要使用指针,在这种情况下甚至不要使用智能指针:

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");
}

编译器肯定会优化返回值副本,应用称为返回值优化的优化,所以你不应该担心这个。在这种情况下,与使用分配在堆栈上的对象并依赖此优化相比,使用指针来避免复制可能最终会变得更加低效和乏味。

Otherwise, consider using std::unique_ptr as @templatetypedef mentions. Avoid pointers whenever you can.

于 2012-12-24T22:19:33.390 回答