20200427 学习小结C++智能指针

shared_ptr 共享指针
一、初始化
1、默认初始化

shared_ptr<int> ptr;//默认为空指针

2、使用make_shared

shared_ptr<int> ptr=make_shared<int>(10);

3、借助内置指针初始化

shared_ptr<int> ptr(new int (10));

二、智能指针如何自动管理内存

初始ptr对应的对象引用计数是1

auto ptr=make_shared<int>(10);

当拷贝一个智能指针时,该智能指针所指向的对象的引用计数递增。

auto ptr=make_shared<int>(10);//引用计数为1
auto p1(ptr);//ptr和p1指向同一个对象,引用计数变为2

另外,当智能指针作为函数参数传递时、作为函数返回值返回时也是一种拷贝,引用计数也会递增。
当智能指针被销毁时(比如局部智能指针离开作用域)、给智能指针赋新值时引用计数减1

{
	auto ptr=make_shared<int>(10);//局部智能指针
}
//当离开作用域后ptr销毁,调用析构函数,引用计数减一,引用计数变为0,内存自动释放
{
	int* p=new int(1);
}
//在离开作用域后内置指针p被销毁,但是p指向的内存没有被释放,发生了内存泄漏
auto ptr=make_shared<int>(10);//引用计数为1
auto q=make_shared<int>(1);
q=ptr;//ptr指向对象引用计数+1,变为2,q原来指向的对象引用计数-1,变为0,q原来指向的内存被自动释放。

三、使用shared_ptr 的注意事项
1、(ptr是一个智能指针) ptr.get() 返回一个内置指针,指向同一个对象,如果手动delete了返回的内置指针,那原先的智能指针的内存也被释放了。
2、如果用同一个内置指针初始化多个智能指针,相当于多个独立的智能指针指向同一个对象,当有一个智能指针销毁,其他的智能指针将没有意义

unique_ptr

unique_ptr 只能有一个unique_ptr指向给定对象

unique_ptr<int> u(new int(1));
unique_ptr<int> p(new int(2));
auto q=u.release();//release将u置为空,并且返回指针,赋值给q,即将控制权交给q
p.reset(q.release());//将q置空并且将p重置指向为q原来指向的对象

你可能感兴趣的:(每日学习总结)