std::shared_ptr
是一种智能指针(本身就是一个对象),指向一个对象。它能够记录多少个 shared_ptr 共同指向一个对象,从而消除显示的调用 delete,当引用计数变为零的时候就会将对象自动删除。
std::shared_ptr 可以通过 get() 方法来获取原始指针,通过 reset() 来减少一个引用计数, 并通过use_count()来查看一个对象的引用计数。
//创建了一个 40字节内存空间 的对象,pointer 指向这个对象
std::shared_ptr pointer = new int(10);
std::shared_ptr pointer2 = pointer; // pointer2 也指向这个对象,且引用计数+1
int *p = pointer.get(); // 这样不会增加引用计数
std::cout << "pointer.use_count() = " << pointer.use_count() << std::endl; // 3
std::cout << "pointer2.use_count() = " << pointer2.use_count() << std::endl; // 3
//创建一个指针ptrB 栈对象,构造函数中没有任何参数,因此默认指向的是null。
std::shared_ptr<int> ptrB();
//这种写法也可以,{}表示赋初值或者说初始化,其它类型变量定义也是如此,是c++11的语法特性
std::shared_ptr<int> ptrB{std::make_shared<int>(5)};
注意:
std::make_shared
不支持数组。
std::make_shared
主要功能是在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。
//p1指向一个值为"9999999999"的string对象
shared_ptr<string> p1 = make_shared<string>(10, '9');
//p2指向一个值为"hello"的string对象
shared_ptr<string> p2 = make_shared<string>("hello");
//p2指向一个为空的string对象
shared_ptr<string> p3 = make_shared<string>();
//这种写法也可以,{}表示赋初值或者说初始化,其它类型变量定义也是如此,是c++11的语法特性
std::shared_ptr<int> ptrB{std::make_shared<int>(5)};
和上面直接使用 new<string>("hello")相比,有什么好处呢:
看下面两张图:内存分配可以一次性完成. 这减少了内存分配的次数, 而内存分配是代价很高的操作.