2

这种方法不安全吗?

#include <tr1/memory>

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

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

  return 0;
}

还是最好createFoo返回一个shared_ptr<Foo>对象?

4

2 回答 2

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 更清楚地说明了指针的预期用途,当不熟悉您的代码的人必须理解它时,这总是一个加分项。

于 2011-04-07T21:00:58.043 回答
2

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

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

于 2011-04-07T20:49:49.587 回答