1、智能指针概念以及为什么引入智能指针
2、shared_ptr类的创建
shared_ptr<string> p1 //shared_ptr 指向string类型
shared_ptr<list<int>> p2 //shared_ptr 指向int类型的list
3、make_shared函数使用
???????? 最安全的分配和使用动态内存的方法是调用一个名为make_shared的标准库函数。此函数在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。当要用make_shared时,必须指定想要创建的对象的类型,定义方式与模板类相同。在函数名之后跟一个尖括号,在其中给出类型。例如,调用make_shared<string>时传递的参数必须与string的某个构造函数相匹配。如果不传递任何参数,对象就会进行值初始化。
//指向一个值为24的int的shared_ptr
shared_ptr<int> p3 =make_shared<int>(42)
//指向一个值为"99999"的string的shared_ptr
shared_ptr<int> p4 =make_shared<string>(5,'9')
//指向一个值为0的int的shared_ptr
shared_ptr<int> p3 =make_shared<int>()
auto和make_shared
通常用auto定义一个对象来保存make_shared的结果
//指向一个值为24的int的shared_ptr
auto p6 =make_shared<int>(42)
4、shared_ptr的拷贝和赋值
1、当新的 shared_ptr 对象与指针关联时,则在其构造函数中,将与此指针关联的引用计数增加1。 2、当任何 shared_ptr 对象超出作用域时,则在其析构函数中,它将关联指针的引用计数减1。如果引用计数变为0,则表示没有其他 shared_ptr 对象与此内存关联,在这种情况下,它使用delete函数删除该内存。
auto p=make_shared<int>(42) //p指向的对象只有p一个引用者
auto q(p) //p和q指向相同对象,此对象有两个引用者
?
?检查 shared_ptr 对象的引用计数
p1.use_count();
完整实例
#include <iostream>
#include <memory> // 需要包含这个头文件
int main()
{
// 使用 make_shared 创建空对象
std::shared_ptr<int> p1 = std::make_shared<int>();
*p1 = 78;
std::cout << "p1 = " << *p1 << std::endl; // 输出78
// 打印引用个数:1
std::cout << "p1 Reference count = " << p1.use_count() << std::endl;
// 第2个 shared_ptr 对象指向同一个指针
std::shared_ptr<int> p2(p1);
// 下面两个输出都是:2
std::cout << "p2 Reference count = " << p2.use_count() << std::endl;
std::cout << "p1 Reference count = " << p1.use_count() << std::endl;
// 比较智能指针,p1 等于 p2
if (p1 == p2) {
std::cout << "p1 and p2 are pointing to same pointer\n";
}
std::cout<<"Reset p1 "<<std::endl;
// 无参数调用reset,无关联指针,引用个数为0
p1.reset();
std::cout << "p1 Reference Count = " << p1.use_count() << std::endl;
// 带参数调用reset,引用个数为1
p1.reset(new int(11));
std::cout << "p1 Reference Count = " << p1.use_count() << std::endl;
// 把对象重置为NULL,引用计数为0
p1 = nullptr;
std::cout << "p1 Reference Count = " << p1.use_count() << std::endl;
if (!p1) {
std::cout << "p1 is NULL" << std::endl; // 输出
}
return 0;
}
参考
c++ primer5
C++ 智能指针 shared_ptr 详解与示例_彼此当年少,莫负好时光-CSDN博客_shared_ptr
C++11中shared_ptr的使用_网络资源是无限的-CSDN博客_shared_ptr
|