具体原因同dynamic_cast一样,详细见下边卡片链接文章)以及reinterpret_pointer_cast的使用过程和上面的static_pointer_cast类似,这里不赘述,都是shared_ptr“指针”的相关转换,对应的底层逻辑都是调用const_cast、dynamic_cast以及reinterpret_cast函数进行实现的,这几种针对裸指针(raw pointer)的转换的作用和说明可以参考下...
我们使用shared_ptr时,注意不能直接通过同一个 raw pointer 指针来构造多个shared_ptr: int *p = new int{10}; shared_ptr<int> ptr1{ p }; shared_ptr<int> ptr2{ p }; 这样的操作后,出现了ptr1和ptr2指向了同一块内存,但是确实不同的sharedptr,ptr1、ptr2的use_count都是1,当其中一个use_count...
shared_ptr的产生与unique_ptr类似,都是为了解决raw pointer的new和delete的成对使用,导致的野指针、内存泄漏、重复释放内存等。 不过shared_ptr与unique_ptr场景又有所不同,这里主要是一个raw pointer在不同的代码块之间传来传去的场景,或者指针指向的内存比较大,这段内存可以切分成很多小部分,但是他们却需要共享彼...
引用计数指的是,所有管理同一个裸指针(raw pointer)的shared_ptr,都共享一个引用计数器,每当一个shared_ptr被赋值(或拷贝构造)给其它shared_ptr时,这个共享的引用计数器就加1,当一个shared_ptr析构或者被用于管理其它裸指针时,这个引用计数器就减1,如果此时发现引用计数器为0,那么说明它是管理这个指针的最后一个...
在shared_ptr 中看到【重复析构】这个词,其实有点诧异,因为 share_ptr 不正是由于普通指针(raw pointer)可能的内存泄露和重复析构而提出的嘛,怎么自身还有重蹈覆辙呢? 原因就在于,很多时候没有完全使用 shared_ptr ,而是普通指针和智能指针混搭在一起,或是很隐蔽地出现了这样情况,都会导致重复析构的发生。
这篇文章本是作为:C++ 智能指针类的第二部分,但无奈那篇篇幅已经不能再长了,于是只好将其单独写成一篇,且把 shared_ptr 的循环引用放在这里写,这样稍微比较连贯一些。 一、shared_ptr 的循环引用 定义:所谓循环引用,可类比于这样的一棵树,它含有父亲结点指向孩子结点的指针,也有孩子结点指向父亲结点的指针,即父亲...
ptr<int> sp); void use_shared_ptr_by_reference(shared_ptr<int>& sp); void use_shared_ptr_by_const_reference(const shared_ptr<int>& sp); void use_raw_pointer(int* p); void use_reference(int& r); void test() { auto sp = make_shared<int>(5); // Pass the shared_ptr by ...
shared_ptr具有以下优点: 轻量级:相比raw pointer和unique_ptr,shared_ptr更轻量级,占用资源更少。 安全:通过引用计数实现,避免了多个指针同时拥有同一个对象时可能出现的竞争条件和死锁等问题。 线程安全:可以使用std::shared_ptr,它是线程安全的,可以安全地在多线程环境中使用。
在上述代码中,new int(5)是一个原始指针,被std::shared_ptr构造函数封装。在口语交流中,我们可以将其解释为 “Instantiate a shared_ptr that wraps a raw pointer to an integer initialized to 5.”(实例化一个封装了指向初始化为5的整数的原始指针的shared_ptr)。
The raw pointer overloads assume ownership of the pointed-to object. Therefore, constructing ashared_ptrusing the raw pointer overload for an object that is already managed by ashared_ptr, such as byshared_ptr(ptr.get())is likely to lead to undefined behavior, even if the object is of ...