官方接单发单平台上线!有接单发单需求的请直接发布需求,或注册接单!点击此处查看详情!

掌握C++中智能指针的使用,如shared_ptr和unique_ptr,以及它们与原始指针的区别

时间:2024-04-10 浏览:36 分类:C/C++程序代做

91代做网-专注各种程序代做

包括但不限于:各类毕设课设、作业辅导、代码答疑、报告论文、商业程序开发、论文复现和小程序开发等。

也欢迎各行业程序员加入我们,具体请联系客服详聊:QQ号:,微信号:,接单Q群:

C++智能指针使用详解:shared_ptr和unique_ptr

引言

C++98中引入了auto_ptr作为智能指针的初步尝试,然而由于其设计上的缺陷,C++11标准中废弃了auto_ptr并引入了两种新的智能指针:shared_ptr和unique_ptr。这两种智能指针可以有效解决内存泄漏野指针等问题,是C++内存管理的重要工具。本文将深入探讨shared_ptr和unique_ptr的使用方法及其与原始指针的区别。

shared_ptr

基本用法

shared_ptr是一个引用计数型智能指针,允许多个shared_ptr共享同一块内存。每次复制shared_ptr时,内部的引用计数会增加,当任何一个shared_ptr被销毁时,引用计数会减少,当引用计数降到0时,所拥有的内存会被释放。

#include <memory> // 包含shared_ptr的头文件
int main() {
std::shared_ptr<int> sp(new int(10)); // 创建一个shared_ptr
std::shared_ptr<int> sp2 = sp; // 复制shared_ptr,引用计数+1
*sp2 = 20; // 通过shared_ptr操作内存
return 0;
}

自定义删除器

shared_ptr可以接受一个删除器,当引用计数为0时,会调用这个删除器来释放内存。这对于文件句柄、网络连接等资源的释放尤其有用。

std::shared_ptr<FILE> filePtr(fopen("data.txt", "r"), fclose);
// 当filePtr引用计数为0时,会自动调用fclose关闭文件

unique_ptr

基本用法

unique_ptr是C++11中引入的另一种智能指针,它独占所拥有的内存,不允许复制,但可以移动。这保证了任何时刻都只有一个unique_ptr指向给定内存,从而避免了内存泄漏。

#include <memory>
int main() {
std::unique_ptr<int> up(new int(10)); // 创建一个unique_ptr
// std::unique_ptr<int> up2 = up; // 错误,不允许复制
std::unique_ptr<int> up2 = std::move(up); // 允许移动
return 0;
}

自定义删除器

unique_ptr同样支持自定义删除器,使用方式与shared_ptr类似。

与原始指针的区别

管理内存的生命周期

原始指针不负责管理内存的生命周期,一旦出现异常或者忘记释放内存,就可能导致内存泄漏。而智能指针内部实现了引用计数或者独占机制,可以确保内存的自动释放

安全性

智能指针提供了对悬垂指针(dangling pointer)和野指针(wild pointer)的安全处理。当智能指针指向的内存被释放后,智能指针会自动置为nullptr,防止悬垂指针的出现。

总结

智能指针shared_ptr和unique_ptr是C++内存管理的重要工具,可以有效避免内存泄漏和野指针等问题。它们提供了比原始指针更安全、更方便的内存管理方式。通过本文的介绍,我们了解到智能指针的基本用法、自定义删除器以及与原始指针的区别。在实际开发中,我们应该优先使用智能指针来管理动态分配的内存。

客服