【发布时间】:2012-09-05 12:00:06
【问题描述】:
我最近注意到在使用返回的空 shared_ptr 时出现了一些奇怪的行为。为了说明这个问题,考虑这个例子:
struct A {
A() { }
void foo() {
std::cout << "A::foo" << std::endl;
}
};
struct B {
B() :i(42) { }
void foo() {
std::cout << "B:foo with i: " << i << std::endl;
}
int i;
};
template<typename T>
std::shared_ptr<T> create_empty() {
return std::shared_ptr<T>();
}
然后调用:
std::shared_ptr<A> pa(create_empty<A>());
pa->foo(); // #1: Works fine and prints: "A::foo".
std::shared_ptr<B> pb(create_empty<B>());
pb->foo(); // #2: Throws an exception.
现在我的问题是为什么调用 #1 有效(我预计也会出现异常),如果这是正确的行为,如何防止 #1 工作。我应该检查返回值是否为空吗?还有其他方法可以返回 null 或空 shared_ptr 吗?如果这很重要,我正在使用 MSVC++ 11...
【问题讨论】:
-
C++ 通常不会在没有用户明确请求的情况下添加昂贵的检查。您可以自行决定将
if (pa)添加到您的代码中。
标签: c++ null return-value shared-ptr dereference