这种方法不安全吗?
#include <tr1/memory>
Foo * createFoo()
{
return new Foo(5);
}
int main()
{
std::tr1::shared_ptr<Foo> bar(create());
return 0;
}
或者createFoo
最好返回shared_ptr<Foo>
个对象吗?
答案 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
可能会引入一些耦合。)