void f1(unique_ptr<A[]>& upA){
//some work...
//callee can mess up smart pointer many ways for caller
upA.reset();
//some work...
}
void f2(const unique_ptr<A[]>& upA){
//some work...
//compiler stops callee from ruining smart pointer many ways for caller
upA.reset();
//some work...
}
f1(upAArray);
f2(upAArray);
在上面的代码中,调用f1是危险的,因为被调用方可以通过重置智能指针、释放智能指针等方式来破坏它。而调用f2则是安全的,一切都很顺利。如果被调用方试图做些不好的事情,编译器就会捕获到它。这样,在调用栈回溯并返回给调用者时,智能指针就是正确的。
重要提示:我不是在问如何最好地传递智能指针(我知道一个常规的原始指针void f3(A* pAArray){}就可以了)。我想知道的是,f2有什么问题?一般的建议是不要使用const ref作为唯一指针的参数,虽然我明白这不是最佳选择,但我不明白为什么它比f1更糟糕。
具体而言,针对f2有哪些理由呢?它有什么问题吗?它似乎安全可靠(尽管肯定不是最佳选择),我不明白为什么它会那么糟糕。
unique_ptr
。它是const
还是非const
并不是问题所在。为什么f1
或f2
需要使用unique_ptr
? - Nicol Bolas