一种形式是std::weak_ptr::lock,它返回一个std::shared_ptr,如果std::weak_ptr过期这个std::shared_ptr为空: std::shared_ptr<Widget> spw1 = wpw.lock(); //如果wpw过期,spw1就为空 auto spw2 = wpw.lock(); //同上,但是使用auto 另一种形式是以std::weak_ptr为实参构造std::shared_ptr。
它通过引用计数来实现这一点,即当一个新的std::shared_ptr指向一个对象时,该对象的引用计数加一,当一个std::shared_ptr被销毁时,该对象的引用计数减一,当引用计数达到0时,对象会被自动销毁。 std::shared_ptr<int> ptr1(new int(5));std::shared_ptr<int> ptr2 = ptr1; // OK! ptr1 and ptr2 ...
这就是std::weak_ptr能判断其绑定的std::shared_ptr管理的对象是否已经析构。 但有一个问题,如果我只是用std::weak_ptr来判断其绑定的std::shared_ptr管理的对象是否已经析构,但其绑定的std::shared_ptr管理的对象类型不一定怎么办?正如标题所言,std::weak_ptr<void>可以绑定到所有类型的std::shared_ptr,所...
weak_ptr在C++11标准中,除了unique_ptr和shared_ptr,智能指针还包括了weak_ptr这个类模板。weak_ptr的使用更为复杂一点,它可以指向shared_ptr指针指向的对象内存,却并不拥有该内存。使用weak_ptr成员函数lock,则可返回其指向内存的一个shared_ptr对象,且在所指对象内存已经无效时,返回空指针。 为什么会引入weak_ptr...
经过了简单的调研(也就是写点小demo测试一下), 我发现std::shared_ptr 与 std::weak_ptr共同使用比较适合这种情况. 简单来说, 就是考虑以下情况: 我有一个工厂, 会生产各种产品. 然后产品有个"远程销毁"的功能, 可以随时将已经生产过的产品给销毁掉. 需求就是: 使用这个产品的地方, 需要知道这个产品已经被...
std::weak_ptr是一种弱引用,它不会影响std::shared_ptr的引用计数,因此可以避免循环引用问题。std::weak_ptr的主要作用是打破循环引用,同时提供一种安全的方式来访问std::shared_ptr所管理的对象。 示例:使用std::weak_ptr解决循环引用 #include<iostream> ...
std::weak_ptr并不直接操作引用计数,这意味着它不会增加或减少与指向对象的关联。这种设计是为了避免循环引用的问题,这是std::shared_ptr中常见的问题。当一个对象通过多个std::shared_ptr共享引用时,如果这些std::shared_ptr在对象被销毁后仍然存在,就会导致资源泄漏。而std::weak_ptr的引入,就是...
一、概述1. auto_ptr:c++11中推荐不使用他(放弃) 2.shared_ptr: 每添加一次引用就+1,减少一次引用,就-1;做到指针进行共享3. unique_ptr:一个指针同时只能有一个使用者使用 4. weaked_ptr: 与shared_ptr搭配使用 二、详细说明 1.shared_ptr为T类型的变量定义std::shared_ptr<;T> ...
std::shared_ptr<Widget> spw1 = wpw.lock(); // 如果 wpw 过期,spw1 将为空 1. 或者直接构造 std::shared_ptr,如果 std::weak_ptr 过期则抛出 std::bad_weak_ptr 异常。 try { std::shared_ptr<Widget> spw3(wpw); // 如果 wpw 过期,这里会抛出异常 ...
另一种形式是把std::weak_ptr作为参数来构造std::shared_ptr。这样,如果std::weak_ptr失效的话,则会抛异常: std::shared_ptr<Widget> spw3(wpw); // if wpw's expired, // throw std::bad_weak_ptr 可能你还是很疑惑std::weak_ptr怎样使用呢。设想一个工厂函数,基于唯一ID来创建一些指向只读对象的灵...