共享指针
共享指针是一种智能指针,它允许多个指针指向同一个对象。共享指针有助于管理内存,防止内存泄漏。
语法
shared_ptr<T> ptr; // 创建一个共享指针,指向类型为 T 的对象
使用方式
- 创建共享指针:使用
make_shared
函数创建共享指针,该函数接受要指向的对象的类型和构造函数参数。 - 获取指向的对象:使用
get()
方法获取指向共享指针指向的对象的原始指针。 - 共享所有权:多个共享指针可以指向同一个对象。当一个共享指针超出作用域时,它的引用计数会减少,但对象不会被释放,直到所有共享指针都超出作用域。
- 释放所有权:使用
reset()
方法释放共享指针对对象的引用。当所有共享指针都调用reset()
时,对象将被释放。
示例
#include <memory>int main() {// 创建一个指向整数的共享指针std::shared_ptr<int> ptr = std::make_shared<int>(10);// 另一个指向同一个对象的共享指针std::shared_ptr<int> ptr2 = ptr;// 输出对象的引用计数std::cout << ptr.use_count() << std::endl; // 2// 释放 ptr2 对对象的引用ptr2.reset();// 输出对象的引用计数std::cout << ptr.use_count() << std::endl; // 1// 释放 ptr 对对象的引用ptr.reset();// 对象被释放
}
优点
- 防止内存泄漏:**共享指针确保在所有共享指针超出作用域后释放对象。
- 自动管理引用计数:共享指针自动管理指向对象的引用计数。
- 支持多线程:共享指针是线程安全的,可以安全地在多线程环境中使用。
缺点
- 开销:共享指针比原始指针有轻微的开销,因为它们需要维护引用计数。
- 循环引用:如果两个共享指针相互引用(循环引用),则它们都将永远不会被释放。