推荐答案
// www.javascriptcn.com code example
#include <iostream>
#include <memory> // 包含 shared_ptr 的头文件
class MyClass {
public:
MyClass() { std::cout << "MyClass constructed\n"; }
~MyClass() { std::cout << "MyClass destroyed\n"; }
void doSomething() { std::cout << "Doing something\n"; }
};
int main() {
// 创建一个 shared_ptr 并指向 MyClass 对象
std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
// 创建另一个 shared_ptr,共享同一个对象
std::shared_ptr<MyClass> ptr2 = ptr1;
// 使用 shared_ptr 调用对象的方法
ptr1->doSomething();
ptr2->doSomething();
// 输出引用计数
std::cout << "Reference count: " << ptr1.use_count() << std::endl;
// ptr1 和 ptr2 离开作用域,引用计数减少,对象被自动销毁
return 0;
}本题详细解读
1. shared_ptr 的特点
std::shared_ptr 是 C++ 标准库中的一种智能指针,用于管理动态分配的对象。它的主要特点包括:
- 共享所有权:多个
shared_ptr可以共享同一个对象的所有权。当最后一个shared_ptr被销毁或重置时,对象才会被自动删除。 - 引用计数:
shared_ptr使用引用计数来跟踪有多少个shared_ptr共享同一个对象。每次复制或赋值shared_ptr时,引用计数会增加;每次shared_ptr被销毁或重置时,引用计数会减少。 - 自动内存管理:当引用计数降为零时,
shared_ptr会自动删除所管理的对象,从而避免内存泄漏。
2. shared_ptr 的用法
创建
shared_ptr:可以使用std::make_shared函数来创建shared_ptr,这是推荐的方式,因为它更高效且更安全。std::shared_ptr<MyClass> ptr = std::make_shared<MyClass>();
共享所有权:可以通过赋值操作将
shared_ptr共享给其他shared_ptr。std::shared_ptr<MyClass> ptr2 = ptr1;
访问对象:可以使用
->或*操作符来访问shared_ptr所管理的对象。ptr1->doSomething(); (*ptr1).doSomething();
获取引用计数:可以使用
use_count()方法获取当前shared_ptr的引用计数。std::cout << "Reference count: " << ptr1.use_count() << std::endl;
重置
shared_ptr:可以使用reset()方法来重置shared_ptr,使其不再管理当前对象。ptr1.reset();
3. 注意事项
循环引用:如果两个或多个
shared_ptr相互引用,可能会导致循环引用问题,从而导致内存泄漏。这种情况下,可以考虑使用std::weak_ptr来打破循环引用。性能开销:由于
shared_ptr需要维护引用计数,因此它比裸指针和std::unique_ptr有更高的性能开销。线程安全:
shared_ptr的引用计数操作是线程安全的,但访问所管理的对象本身并不保证线程安全。