安全std :: tr1 :: shared_ptr用法

时间:2011-04-07 20:32:09

标签: c++ memory-leaks shared-ptr exception-safe

这种方法不安全吗?

#include <tr1/memory>

Foo * createFoo()
{
  return new Foo(5);
}

int main()
{
  std::tr1::shared_ptr<Foo> bar(create());

  return 0;
}

或者createFoo最好返回shared_ptr<Foo>个对象吗?

2 个答案:

答案 0 :(得分:3)

你的例子就像你写的那样安全。但是,通过让工厂方法createFoo()返回自动指针而不是原始指针,可以使其更加防漏。这样你就可以保证不会有泄漏。

所以你得到的是:

#include <memory>
#include <tr1/memory>

std::auto_ptr<Foo> createFoo()
{
  return std::auto_ptr<Foo>(new Foo(5));
}

int main()
{
  std::tr1::shared_ptr<Foo> bar(createFoo());

  return 0;
}

当然也可以让你的工厂方法返回一个shared_ptr,但这可能被视为过度,因为返回的指针通常会很快超出范围,因为它将在赋值或构造函数中使用。此外,使用auto_ptr可以更清楚地说明指针的预期用途,当不熟悉您的代码的人必须理解它时,这总是一个加分。

答案 1 :(得分:2)

示例是安全的:如果shared_ptr构造函数抛出异常,则delete在抛出之前是其指针参数(草案标准,20.9.11.2.1)。

create是否应该返回shared_ptr取决于客户可能合理地想要对其结果做什么。如果他们所做的只是将它包裹在shared_ptr中,那么为了额外的安全而返回它。 (是的,shared_ptr可能会引入一些耦合。)