首先:shared_ptr
shared_ptr<int> q2 =new int(42) //这个拷贝初始化操作错误,
//因为智能指针构造函数是explicit 的 =所以右边是一个int *不能隐式转换到shared_ptr、
shared_ptr<int> q2(new int(42))//采用直接初始化正确的
//如果非要采用拷贝初始化,必须以下操作,先显式绑定,
//右式相当于创建了一个shared_ptr临时变量,类似于多参数的sting初始化也必须是这样,
//单参数string可以拷贝初始化。
shared_ptr<int>o q2 =shared_ptr<int>(new int(42) )//正确,显式绑定拷贝初始化。
关于use_count
std::shared_ptr<int> p1(new int(42));
int *q1 = p1.get();
{
//shared_ptr<int>(q1); 如果单单这个语句,是不会影响p1的。
//单独创建临时变量不进行拷贝操作,临时创建变量销毁后对p1管理的内存并没有任何影响。
auto q2 =shared_ptr<int>(q1) 这样才有一个实质的q2指向和p1一样的动态内存
//但这样q2不是p1的拷贝,是相互独立创建的,所以use_count是各自为1
cout << "after q2 q2 use count is " << q2.use_count();
cout << "after q2 p1 use count is " << p1.use_count();
}
//结束后会q2销毁 ,动态内存会释放这时候p1是一个空悬指针,
//已经无法正确访问p1
//那么在main函数结束后又要自动释放p1(因为智能指针范围失效自动释放)的内存,产生了双重释放错误
/*
std::shared_ptr<int> p1(new int(42));
//创建一个临时变量 ,并传递给函数参数shared_ptr变量进行拷贝,但不是p1的拷贝,
//那么这个函数参数shared_ptr变量是和p1独立建造的,
//所以use_count是各自为1,但和p1指向同样的动态内存,
process(std::shared_ptr<int>(p1.get()));
//函数结束后销毁了函数中的shared_ptr变量,释放了内存,
//那么p1也就成为了空悬指针,在main函数结束后,又要自动释放p1的内存,
//但此时p1的内存已经释放了
//产生了双重释放
//但如果p1就是一个内置指针指向动态内存auto p1 = new int(42);
//process(std::shared_ptr<int>(p1));就不存在双重释放
//因为main函数结束后,不会自动释放p1(因为不是智能指针)但p1成为了空悬指针
然后:unique_ptr
int ix = 1024, *pi = &ix, *pi2 = new int(2048);
typedef std::unique_ptr<int> IntP;
// IntP p0(ix);//参数就错误了
// IntP p1(pi);//编译能通过,但最后main函数结束p1会释放内存操作, 但p1指向的不是动态内存(不是new分配的),所以报错
// IntP p2(pi2); //main函数结束p2会释放内存操作,那么pi2指向的内存就被释放,pi2就成为了空悬指针
// IntP p3(&ix);///编译能通过,但最后main函数结束p3会释放内存操作, 但p3指向的不是动态内存(不是new分配的),所以报错
// IntP p4(new int(2048));//正常 正确
/* p2和p5指向同一内存,但是为unique_ptr类型,所以错误
IntP p2(new int(555));
IntP p5(p2.get());
*/