// shared_ptr 和内置指针结合使用,慎重
void process(shared_ptr<int> ptr) {
cout << *ptr << endl;
}
void SharedPtrTest3() {
// shared_ptr<int> p1 = new int(1024); // 错误,explicit构造函数,不能进行隐式转换
shared_ptr<int> p2(new int(1024)); // 通过指针初始化shared_ptr
process(p2);
int value = *p2; // 有效
p2.reset(new int(100)); // p2释放指向的1024,重新指向100
shared_ptr<int> pCp = p2;
if( !p2.unique() ) {
// p2不是所知对象的仅有用户,改变之前制作一份新的拷贝
p2.reset(new int(*p2));
}
*p2 = 200; // 可以放心的修改p2指向的内容了
// 临时shared_ptr会释放
int *x = new int(2048);
process(shared_ptr<int>(x)); // 临时shared_ptr,该条语句结束后被释放,即x指向内存被释放
value = *x; // x指向内存已经被释放,悬空指针,未定义行为
// 绝对不要使用get初始化另一个智能指针或为内置指针赋值
shared_ptr<int> p(new int(1024));
int *q = p.get();
{
value = *p;
shared_ptr<int> p3(q); // p3遇到 "}" 会释放指向的内存空间,即p,q指向内存已经被释放
}
value = *p; // 错误
return;
}
参考
C++ primer中文版 第五版 12章