std::weak_ptr<int> wPtr = sPtr; //weak_ptr不会改变shared_ptr,但是会和shared_ptr的引用保持一致 std::shared_ptr<int> sPtr2 = wPtr.lock(); //wPtr.lock()后会改变shared_ptr的引用计数(+1)
std::cout<<"shared_ptr object(int) size = "<<sizeof(a)<<std::endl; ??std::cout<<"shared_ptr object(char) size = "<<sizeof(b)<<std::endl; ??? ??std::weak_ptr<A>shadow_a; ??std::weak_ptr<B>shadow_b; ??? ??{ ??std::shared_ptr<A>ptr_a=std::make_shared<A>()...
std::cout <<"shared_ptr object(int) size = "<<sizeof(a) << std::endl; std::cout <<"shared_ptr object(char) size = "<<sizeof(b) << std::endl; std::weak_ptr<A> shadow_a; std::weak_ptr<B> shadow_b; { std::shared_ptr<A> ptr_a = std::make_shared<A>(); std::s...
shared_ptr采用引用计数的方式管理所指向的对象。当有一个新的shared_ptr指向同一个对象时(复制shared_ptr等),引用计数加1。当shared_ptr离开作用域时,引用计数减1。当引用计数为0时,释放所管理的内存。 这样做的好处在于解放了程序员手动释放内存的压力。之前,为了处理程序中的异常情况,往往需要将指针手动封装到类...
weak_ptr并不增加shared_ptr的引用计数,因此有可能发生对象已经析构但是weak_ptr还在的情况,此时使用weak_ptr就必须小心,当对象即将发生析构或者已经析构,expired返回true,expired函数效率比use_count高,该函数返回true时其结果才有意义,因为返回false时,此时执行下一个语句,对象有可能在其他线程同时被释放。
(如果使用了std::weak_ptr)一个弱引用计数 对象的销毁器和分配器的信息(如何销毁对象和释放内存) 指向实际数据的指针:这是std::shared_ptr持有的,用于访问被管理对象的指针。 每当通过复制构造函数或赋值操作符创建新的std::shared_ptr时,与该指针关联的控制块中的引用计数会增加。当std::shared_ptr的实例被销毁...
weak_ptr的尺寸和shared_ptr尺寸一样大,是裸指针的2倍 */voidfunc(){ weak_ptr<int> pw;int* p;intpw_len =sizeof(pw);//8个字节 内部有两个指针,一个指向对象类型的指针,一个指向控制块的指针intp_len =sizeof(p);//4个字节//第一个裸指针指向的是这个智能指针所指向的对象autop1 = make_share...
new XXX(shared_from_this()) 如果用强指针去接,则增加引用计数;弱引用去接,不增加引用计数。auto去接等同强指针。weak_ptr 传给thread、timer回调,不能使用expired()判断 new XXX(shared_from_this()) 如果用强指针去接,则增加引用计数;弱引用去接,不增加引用计数。auto去接等同强指针。
作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成段错误(segment fault)或者内存泄漏(memory leak)。 今天,借助此文,分析下项目中经常遇到的导致内存泄漏的原因,以及如何避...
(3)安全地转换为 std::shared_ptr: 使用lock() 方法,如果 std::weak_ptr 过期则返回空的 std::shared_ptr。 std::shared_ptr<Widget> spw1 = wpw.lock(); // 如果 wpw 过期,spw1 将为空 1. 或者直接构造 std::shared_ptr,如果 std::weak_ptr 过期则抛出 std::bad_weak_ptr 异常。