C++ 智能指针一

/* 智能指针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", 11); //方式二:使用shared_ptr构造函数初始化 std::shared_ptr<Student> sp2(new Student("jack", 12)); //方式三:使用成员方法reset初始化 std::shared_ptr<Student> sp3; sp3.reset(new Student("li", 13)); //注意,不能将一个原始指针直接赋值给一个智能指针,如下所示,原因是一个是类,一个是指针。 //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 0; }

 

posted on 2019-01-20 12:29  寒魔影  阅读(193)  评论(0编辑  收藏  举报

导航