std::shared_ptr 可以通过以下几种方式初始化为空: 默认构造函数:直接使用默认构造函数创建一个 shared_ptr 实例,此时它不指向任何对象,内部指针为空。 使用nullptr 初始化:在创建 shared_ptr 实例时,可以直接使用 nullptr 进行初始化,效果与默认构造函数相同。3...
:shared_ptr是否为空 判断std::shared_ptr是否为空最后发现很简单,可以直接⽤if判断来实现。经@egmkang指出是重载了operator bool。std::shared_ptr<cv::Mat> pMat(new cv::Mat);if (!pMat){ std::cout << "error" << std::endl;} else { std::cout << "correct" << std::endl;} ...
想判断一个shared_ptr是否为空,去http://en.cppreference.com/w/cpp/memory/shared_ptr链接找了接口函数,未发现接口判断是否为空。 最后发现很简单,可以直接用if判断来实现。经@egmkang指出是重载了operator bool。 std::shared_ptr<cv::Mat> pMat(newcv::Mat); if(!pMat) { std::cout <<"error"<< st...
即使没有std::shared_ptr实例持有对象,只要存在std::weak_ptr,对象也不会因为引用计数归零而被销毁。但是,一旦所有std::shared_ptr都释放了该对象,std::weak_ptr就会变成过期状态(expired),此时尝试访问对象是不安全的。 (1)创建std::weak_ptr auto spw = std::make_shared<Widget>(); // 创建一个 shared...
std::shared_ptr<Widget> spw1 = wpw.lock(); //如果wpw过期,spw1就为空 auto spw2 = wpw.lock(); //同上,但是使用auto 另一种形式是以std::weak_ptr为实参构造std::shared_ptr。这种情况中,如果std::weak_ptr过期,会抛出一个异常: std::shared_ptr<Widget> spw3(wpw); //如果wpw过期,抛出std...
shared_ptr共享指针对象存储着另一个对象指针的同时,还可以共享一个对象的拥有权。这个特性可以用来指向其他成员对象,同时拥有创建他们自身的类的对象。 创建shared_ptr对象时,可以不初始化,这时候它为空。(如果使用别名构造函数创建它,则空的shared_ptr对象可能具有非空存储指针)。std::shared_ptr还可以用于不完整类...
你可能疑惑std::weak_ptr能有什么用处,在你看了std::weak_ptr的API后可能更疑惑。它看上去根本不灵巧。std::weak_ptr不能解引用,也不能检查是否为空。这是因为std::weak_ptr不能作为一个独立的灵巧指针,它是作为std::shared_ptr的延伸。 指针生成的时刻就决定了这种关系。std::weak_ptr一般是通过std::shar...
shared_ptr 也能够不拥有对象。称作空(empty)。 最后一个shared_ptr指针被删除时,对象才被删除。 shared_ptr 持有的指针是通过 get() 返回的;而控制块所持有的指针/对象则是终于引用计数归零时会被删除的那个。两者并不一定相等。 shared_ptr 的析构函数会将控制块中的 shared_ptr 计数器减一,假设减至零。控...
你可能想知道std::weak_ptr是为什么很有用。当你研究std::weak_ptrAPI时,你可能会发现它一点也不智能。std::weak_ptrs不能解引用,也不能判断是否为空指针。这都是因为std::weak_ptr不是一个独立的智能指针。它只是std::shared_ptr的扩充。 并且这种扩充关系从std::weak_ptr创建出来就确定了,std::weak_ptr...
空指针对象构造 shared_ptr实例化的时候可以不指向任何对象,此时该shared_ptr为“空”就像是空指针一样...