shared_ptr和new结合使用
一个shared_ptr默认初始化为一个空指针。我们也可以使用new返回的指针来初始化一个shared_ptr:
shared_ptr<double> p1;
shared_ptr<int> p2(new int(42)); // p2指向一个值为42的int
接受指针参数的智能指针构造函数是 explicit 的,因此,我们不能将一个内置指针隐式的转换为一个智能指针,必须使用直接初始化形式:
shared_ptr<int> p1 = new int(1024); // 错误,必须使用直接初始化形式
shared_ptr<int> p2(new int(1024));
p1的初始化隐式的要求编译器用一个new返回的int* 来初始化一个shared_ptr。由于我们不能进行内置指针到智能指针间的隐式转换,因此这条初始化语句是错误的。同样的, 一个返回值为shared_ptr的函数不能在其返回语句中转换一个普通指针:
shared_ptr<int> clone(int p) {
return new int(p); // 错误,隐式转换为shared_ptr
}
我们必须将shared_ptr显示绑定到一个想要返回的指针上:
shared_ptr<int> clone(int p) {
return shared_ptr<int>(new int(p));
}
默认情况下,一个用来初始化智能指针的普通指针必须指向动态内存,因为智能指针默认使用delete来释放它所关联的对象。 我们也可以把智能指针绑定到其他类型的指针上,但是我们必须提供自己的删除操作来替代delete:
shared_ptr<T> p(q) |