C++11 智能指针
Posted bobhuang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++11 智能指针相关的知识,希望对你有一定的参考价值。
上一篇线程池里,有一个返回std::shared_ptr<T>对象,他其实是c++里面的智能指针
std::shared_ptr大概总结有以下几点:
(1) 智能指针主要的用途就是方便资源的管理,自动释放没有指针引用的资源。
(2) 使用引用计数来标识是否有多余指针指向该资源。(注意,shart_ptr本身指针会占1个引用)
(3) 在赋值操作中, 原来资源的引用计数会减一,新指向的资源引用计数会加一。
std::shared_ptr<Test> p1(new Test);
std::shared_ptr<Test> p2(new Test);
p1 = p2;
(4) 引用计数加一/减一操作是原子性的,所以线程安全的。
(5) make_shared要优于使用new,make_shared可以一次将需要内存分配好。
std::shared_ptr<Test> p = std::make_shared<Test>();
std::shared_ptr<Test> p(new Test);
(6) std::shared_ptr的大小是原始指针的两倍,因为它的内部有一个原始指针指向资源,同时有个指针指向引用计数。
(7) 引用计数是分配在动态分配的,std::shared_ptr支持拷贝,新的指针获可以获取前引用计数个数。
以下是cppreference的代码例子,其实也蛮清楚的
#include <iostream> #include <memory> #include <thread> #include <chrono> #include <mutex> struct Base Base() std::cout << " Base::Base()\\n"; // 注意:此处非虚析构函数 OK ~Base() std::cout << " Base::~Base()\\n"; ; struct Derived : public Base Derived() std::cout << " Derived::Derived()\\n"; ~Derived() std::cout << " Derived::~Derived()\\n"; ; void thr(std::shared_ptr<Base> p) std::this_thread::sleep_for(std::chrono::seconds(1)); std::shared_ptr<Base> lp = p; // 线程安全,虽然自增共享的 use_count static std::mutex io_mutex; std::lock_guard<std::mutex> lk(io_mutex); std::cout << "local pointer in a thread:\\n" << " lp.get() = " << lp.get() << ", lp.use_count() = " << lp.use_count() << ‘\\n‘; int main() std::shared_ptr<Base> p = std::make_shared<Derived>(); std::cout << "Created a shared Derived (as a pointer to Base)\\n" << " p.get() = " << p.get() << ", p.use_count() = " << p.use_count() << ‘\\n‘; std::thread t1(thr, p), t2(thr, p), t3(thr, p); p.reset(); // 从 main 释放所有权 std::cout << "Shared ownership between 3 threads and released\\n" << "ownership from main:\\n" << " p.get() = " << p.get() << ", p.use_count() = " << p.use_count() << ‘\\n‘; t1.join(); t2.join(); t3.join(); std::cout << "All threads completed, the last one deleted Derived\\n";
以上是关于C++11 智能指针的主要内容,如果未能解决你的问题,请参考以下文章