在 Scott Meyers 的Effective C++中,第 18 项使接口易于正确使用和难以正确使用,他提到了 null shared_ptr:
std::tr1::shared_ptr<Investment> pInv(static_cast<Investment*>(0), getRidOfInvestment)
和时尚分配操作
pInv = ... //make retVal point to the correct object
在这种情况下,可能需要创建一个空 shared_ptr 并稍后进行分配?为什么不只要有资源(原始指针)就创建 shared_ptr 呢?
由于 Scott Meyers 没有在前面的示例中显示完整的赋值,我认为 shared_ptr 的赋值运算符被重载,可以这样做:
pInv = new Investment; // pInv will take charge of the pointer
// but meanwhile keep the delete function it already had
但是我尝试了boost的实现,但它不能以这种方式工作。那么拥有 null shared_ptr 有什么意义呢?
我几乎可以肯定我在这里遗漏了一些东西,请有人帮我解决这个问题。
附言。有关 shared_ptr 的初始化和分配的更多信息
#include <boost/shared_ptr.hpp>
int main(int argc, char *argv[])
{
boost::shared_ptr<int> ptr1(new int);
boost::shared_ptr<int> ptr2;
ptr2.reset(new int);
boost::shared_ptr<int> ptr3 = new int;
return 0;
}
这个例子不能被g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2和最新的 boost 编译:
sptr.cpp: In function ‘int main(int, char**)’:
sptr.cpp:8:39: error: conversion from ‘int*’ to non-scalar type ‘boost::shared_ptr<int>’ requested