/* 智能指针shared_ptr */
#include <iostream>
#include <string>
#include <memory> //智能指针头文件
/*
shared_ptr 是一个标准的共享所有权的智能指针, 允许多个指针指向同一个对象. 定义在 memory 文件中(非memory.h), 命名空间为 std.
智能指针并非指针,实际上智能指针是一个对象,有构造函数和析构函数的
shared_ptr 是为了解决 auto_ptr 在对象所有权上的局限性(auto_ptr 是独占的), 在使用引用计数的机制上提供了可以共享所有权的智能指针,
当然这需要额外的开销:
(1) shared_ptr 对象除了包括一个所拥有对象的指针外, 还必须包括一个引用计数代理对象的指针.
(2) 时间上的开销主要在初始化和拷贝操作上, *和->操作符重载的开销跟auto_ptr是一样.
(3) 开销并不是我们不使用shared_ptr的理由, 永远不要进行不成熟的优化, 直到性能分析器告诉你这一点.
*/
/*
shared_ptr初始化:
方式一:模板函数 make_shared 创建对象
make_shared 需指定类型('<>'中)及参数('()'内), 传递的参数必须与指定的类型的构造函数匹配
方式二:使用shared_ptr构造函数初始化
方式三:使用成员方法reset初始化
*/
/*
shared_ptr成员函数
use_count 返回引用计数的个数
unique 返回是否是独占所有权( use_count 为 1)
swap 交换两个 shared_ptr 对象(即交换所拥有的对象)
reset 包含两个操作。当智能指针中有值的时候,调用reset()会使引用计数减1.当调用reset(new xxx())重新赋值时,
智能指针首先是生成新对象,然后将就对象的引用计数减1(当然,如果发现引用计数为0时,则析构旧对象),然后将新对象的指针交给智能指针保管。
get 返回内部对象(指针), 由于已经重载了()方法, 因此和直接使用对象是一样的.如 shared_ptr<int> sp(new int(1)); sp 与 sp.get()是等价的
例如
std::shared_ptr<int> p4(new int(5));
int *pInt = p4.get();
*/
class Student
{
public:
Student(std::string name_, int age_) :name(name_), age(age_) {}
public:
std::string name;
int age;
};
void test()
{
//创建一个shared_ptr对象
//方式一:模板函数 make_shared 创建对象
std::shared_ptr<Student> sp1 = std::make_shared<Student>("tom", );
//方式二:使用shared_ptr构造函数初始化
std::shared_ptr<Student> sp2(new Student("jack", ));
//方式三:使用成员方法reset初始化
std::shared_ptr<Student> sp3;
sp3.reset(new Student("li", ));
//注意,不能将一个原始指针直接赋值给一个智能指针,如下所示,原因是一个是类,一个是指针。
//std::shared_ptr<Student> sp4 = new Student("jack", 12); error
//调用对象的成员
printf("--name [%s] \n", sp3->name.c_str());
sp3.reset();//Student(li)计算器减一
printf("sp3.use_count = %d\n", sp3.use_count());
}
int main()
{
test();
getchar();
return ;
}