使用一个内置指针来访问一个智能指针所负责的对象是很危险的,因为我们无法知道对象何时会被销毁。
- 推荐使用make_shared,而不推荐使用new;
- 使用make_shared,我们就能在分配对象的同时就将shared_ptr与之绑定,避免了无意中将同一块内存绑定到多个独立创建的shard_ptr上;
#include<iostream>
#include<memory>
//在函数被调用的时候ptr被创建并初始化
void process(std::shared_ptr<int> ptr) {
//使用ptr
};//ptr离开作用域,被销毁
int main(){
//不要混合使用普通指针和智能指针
int* x(new int(3)); //x是一个普通指针,不是一个智能指针
process(std::shared_ptr<int>(x)); //合法的,但内存会释放
int j = *x; //未定义:x是一个空悬指针
std::cout << j << std::endl<<x<<std::endl; //j = -572662307
} //均未报错,但是j不是我们想要的值
在上面的调用中,在临时对象ptr被销毁时,x的引用计数递减,
从初始化时候的1减为了0,所指向的内存被释放,从而变成空悬指针。
正确使用process:
#include<iostream>
#include<memory>
void process(std::shared_ptr<int> ptr) { };
int main(){
shared_ptr<int> x(new int(3)); //引用计数为1
process(x); //拷贝时引用计数加1,销毁时减1
int j = *x;
std::cout << j << std::endl<<x<<std::endl; //j = 3
}