share_ptr 实现C++
时间: 2024-10-15 21:12:32 浏览: 7
`shared_ptr`是C++标准库中的智能指针,它由Boost库引入并在C++11标准中正式加入。智能指针是一种自动管理内存的对象,它解决了传统C++裸new和delete可能导致的内存泄漏问题。`shared_ptr`实现了引用计数的概念,即每当有一个`shared_ptr`指向某个对象时,该对象的引用计数就会增加;当最后一个`shared_ptr`不再指向该对象时,对象会被析构并释放内存。
`shared_ptr`的特点包括:
1. **共享所有权**:多个`shared_ptr`可以同时持有同一份资源,它们共同负责管理这块内存,直到最后一个`shared_ptr`消失。
2. **自删除**:当所有`shared_ptr`引用计数降为0时,`shared_ptr`会自动调用析构函数,释放所指向的内存。
3. **防止循环引用**:通过引用计数机制,可以避免因循环引用导致的内存泄漏。
4. **线程安全**:`shared_ptr`内部的操作通常原子操作,支持并发环境下的使用。
创建`shared_ptr`的一般形式如下:
```cpp
std::shared_ptr<T> ptr(new T);
```
这里`T`是你要管理的类型,`ptr`就是指向新创建对象的`shared_ptr`。当你传递`shared_ptr`给其他函数时,实际上是在转移资源的所有权,而不再是复制整个对象。
相关问题
share_ptr和unique_ptr
shared_ptr和unique_ptr是C++中两种智能指针的实现。
unique_ptr是一种独占式智能指针,它确保在同一时间只有一个指针可以指向一个对象。它的拷贝构造函数和赋值运算符被禁用,这意味着不能直接拷贝或赋值一个unique_ptr对象。这个特性确保了资源的独占性,可以有效地避免内存泄漏和多重删除问题。
shared_ptr是一种共享式智能指针,它通过使用引用计数来管理所指向的对象。当有一个新的shared_ptr指向同一个对象时,引用计数会加1。当shared_ptr离开作用域时,引用计数会减1。当引用计数变为0时,资源会被释放。这个特性使得多个指针可以共享同一个对象,从而避免了资源的重复释放和悬空指针的问题。
需要注意的是,在移动构造shared_ptr时,原有的shared_ptr会被置空,但引用计数不会发生变化。这意味着移动构造后,原有的shared_ptr不再指向任何对象。
总结一下:
- unique_ptr是一种独占式智能指针,确保同一时间只有一个指针可以指向一个对象。
- shared_ptr是一种共享式智能指针,使用引用计数来管理所指向的对象,可以实现多个指针共享同一个对象。
- 在移动构造shared_ptr时,原有的shared_ptr会被置空,但引用计数不会发生变化。
来源: https://en.cppreference.com/w/cpp/memory/unique_ptr
来源: https://en.cppreference.com/w/cpp/memory/shared_ptr
来源: https://blog.csdn.net/u011784767/article/details/79879281
weak_ptr和share_ptr
C++中的智能指针是一种可以自动管理内存的指针,其中std::shared_ptr和std::weak_ptr是两种常用的智能指针。
std::shared_ptr是一种引用计数智能指针,它可以跟踪有多少个指针指向同一个对象,并在最后一个指针离开作用域时自动释放对象。当我们需要多个指针共享同一个对象时,可以使用std::shared_ptr。std::shared_ptr的构造函数接受一个指向对象的指针,并返回一个指向该对象的std::shared_ptr。每次调用std::shared_ptr的构造函数或者拷贝构造函数时,引用计数都会增加1。当std::shared_ptr被销毁时,引用计数会减少1,当引用计数为0时,std::shared_ptr会自动释放对象。
std::weak_ptr是一种弱引用智能指针,它可以指向一个std::shared_ptr指向的对象,但不会增加引用计数。当std::shared_ptr被销毁时,std::weak_ptr不会自动释放对象,而是变成一个空指针。我们可以使用std::lock()函数将std::weak_ptr转换为std::shared_ptr,如果std::weak_ptr指向的对象已经被释放,则std::lock()函数返回一个空的std::shared_ptr。
使用std::shared_ptr和std::weak_ptr可以避免内存泄漏和悬空指针的问题,提高程序的健壮性和可维护性。
阅读全文