假设托管p的shared_ptr对象叫做ptr,那么*ptr就是p指向的对象。 shared_ptr是最像指针的智能指针,在很多的组件中被应用,shared_ptr包装了new操作符在堆上分配的动态对象,实现的是引用计数型的智能指针,可以被自由的拷贝和赋值,当没有代码使用(引用计数减为0)时会删除包装的动态分配的对象。 shared_ptr也可以安全地...
下面我将分点详细解释如何实现一个简易的shared_ptr,并给出关键代码片段。 1. 理解shared_ptr的基本原理和功能 shared_ptr是一种智能指针,用于自动管理动态分配的对象。它的基本原理是引用计数:多个shared_ptr实例可以共享同一个对象,当最后一个shared_ptr被销毁或重置时,它指向的对象也会被自动删除。 2. 设计一...
1.引进了一个计数器shared_count,用来表示当前有多少个智能指针对象共享指针指向的内存块 2.析构函数中不是直接释放指针对应的内存块,如果shared_count大于1则不释放内存只是将引用计数减1,只是计数等于1时释放内存 3.复制构造与赋值操作符只是提供一般意义上的复制功能,并且将引用计数加1. shared_ptr实现代码(只实...
引用计数是shared_ptr实现自动内存管理的核心机制。当创建一个shared_ptr对象并指向一个新分配的对象时,引用计数被初始化为 1。例如: std::shared_ptr<int> ptr1 = std::make_shared<int>(10); 这里ptr1指向一个新创建的int类型对象,该对象的引用计数为 1,表示有一个shared_ptr指向它。 当进行拷贝构造或赋...
首先,我们需要了解shared_ptr是什么。shared_ptr是C++11引入的一种智能指针,它可以自动管理指向动态分配对象的指针,并在不再使用时自动释放内存。shared_ptr的特点是可以在多个线程之间安全地共享同一个对象,而不需要额外的同步操作。 要实现完全线程安全的shared_ptr,我们需要使用原子操作来保证对指针的访问和修改是线...
shared_ptr的实现 我们平时看文档都知道shared_ptr内部是使用引用计数来记录托管指针被引用的次数,当托管指针的引用计数为0时会释放托管的内存,这里通过gcc源码探究shared_ptr内部究竟是如何实现的内存引用计数功能。非标准类图如下: 点击查看大图如上图,shared_ptr类几乎什么都没有做,它是继承了shared_ptr, shared_ptr...
1. shared_ptr的实现 2. weak_ptr的实现 3. enable_shared_from_this的实现 这个版本的智能指针是我去看了本机上GNU C++标准库中shared_ptr源码后写的,在我的ubuntu22.04上,源码位置在/usr/include/c++/12/bits/shared_ptr_base.h和/usr/include/c++/12/bits/shared_ptr.h下。GNU源码的可读性并不那么好...
于是实现一个非线程安全版本的 shared_ptr 就被提上了日程。思路其实和 Rust的 std::rc::Rc 很像。 其实GCC的 STL本身自带费线程安全的内部版本的,可以通过使用 template<class T> using strong_rc_ptr<T> = std::__shared_ptr<T, std::_S_single>; 然后使用 strong_rc_ptr<T> 就是单线程模式。
std::shared_ptr<int>p(new int(2)); int *q=p.get();//q为一个内置指针,指向和p同一个对象,注意不要delete q 1. 2. 💥智能指针—unique_ptr 和shared_ptr不同,unique_ptr拥有它所有的唯一对象,这样就保证unique_ptr被销毁时,其对象也会被销毁。
Shared_ptr() : m_ptr(nullptr), m_count(new size_t) {} Shared_ptr( T* ptr ) : m_ptr(ptr), m_count(new size_t) { cout<<"空间申请:"<<ptr<<endl; *m_count = 1; } //析构函数 ~Shared_ptr() { --(*m_count);