欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > 【C++八股】智能指针

【C++八股】智能指针

2025/9/22 21:57:31 来源:https://blog.csdn.net/2301_79867980/article/details/145621188  浏览:    关键词:【C++八股】智能指针
智能指针⽤于管理动态内存的对象,其主要⽬的是在避免内存泄漏和多次释放资源。

1. std::unique_ptr 独占智能指针

std::unique_ptr 是一种独立智能指针,独占内存资源,不能被其他独立智能指针共享,拥有自动释放内存的功能。

std::unique_ptr 拥有对某个对象的控制权。当 std::unique_ptr 被销毁时,它所管理的对象也会被自动销毁,从而有效防止内存泄漏。

#include <iostream>
#include <memory>class MyClass {
public:MyClass() { std::cout << "MyClass constructed\n"; }~MyClass() { std::cout << "MyClass destructed\n"; }void doSomething() { std::cout << "Doing something\n"; }
};int main() {// 创建 std::unique_ptrstd::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();// 使用 -> 访问成员ptr1->doSomething();// 无法复制 std::unique_ptr// std::unique_ptr<MyClass> ptr2 = ptr1; // 编译错误// 可以移动 std::unique_ptrstd::unique_ptr<MyClass> ptr2 = std::move(ptr1);// ptr1 现在为空if (ptr1 == nullptr) {std::cout << "ptr1 is null\n";}// ptr2 现在拥有对象ptr2->doSomething();// 离开作用域时,ptr2 自动删除对象
}

2.std::shared_ptr (共享智能指针)

shared_ptr 旨在管理动态分配对象的生命周期,支持多个指针共享同一对象的所有权。它通过引用计数机制来追踪有多少个 std::shared_ptr 实例指向同一个对象,当引用计数降为零时,自动释放所管理的对象,从而有效防止内存泄漏。

主要特性:

  • 共享所有权: 多个 std::shared_ptr 实例可以指向同一个对象,共享对该对象的所有权。每次拷贝或赋值都会增加引用计数,每次析构都会减少引用计数。当引用计数为零时,自动删除所指向的对象。

  • 线程安全: std::shared_ptr 的引用计数是线程安全的,可以在多个线程中安全地拷贝和销毁。但需要注意,对同一对象的操作仍需使用适当的同步机制。

  • 内存管理: std::shared_ptr 内部维护一个控制块,包含引用计数和删除器等信息。使用 std::make_shared 创建 std::shared_ptr 时,会同时分配对象和控制块的内存,避免了多次内存分配,提高了性能。

#include <iostream>
#include <memory>class MyClass {
public:MyClass() { std::cout << "MyClass constructed\n"; }~MyClass() { std::cout << "MyClass destructed\n"; }void doSomething() { std::cout << "Doing something\n"; }
};int main() {// 使用 std::make_shared 创建 std::shared_ptrauto ptr1 = std::make_shared<MyClass>();// 使用 -> 访问成员ptr1->doSomething();// 拷贝构造,引用计数增加auto ptr2 = ptr1;std::cout << "Reference count: " << ptr1.use_count() << "\n"; // 输出 2// 赋值构造,引用计数增加auto ptr3 = ptr2;std::cout << "Reference count: " << ptr1.use_count() << "\n"; // 输出 3// 离开作用域时,ptr1、ptr2 和 ptr3 会被销毁,引用计数减少// 当引用计数为 0 时,自动释放 MyClass 对象
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词