智慧指针是什么以及具体用法

简介: 智慧指针是什么以及具体用法

不建议的用例(仅作示例说明问题):

int*& createHeapInt() {
    int* ptr = new int(5); // 动态分配
    return ptr; // 返回指针的引用,非常危险
}
 
int main() {
    int*& ref = createHeapInt();
    delete ref; // 释放内存,此时ref成为悬挂引用
    // ref = 10; // 这里可能会导致程序崩溃
}

正确的做法是直接管理堆内存的生命周期,或者使用智能指针。

智慧指针(Smart Pointer)

在C++中,是一种模拟拥有所有权的指针对象,设计用于自动管理动态分配的内存,以防止内存泄漏和悬挂指针的问题。智慧指针通过自动执行适当的删除操作(如调用delete),确保当一个对象不再需要时,其所占用的资源能够被及时释放。它们是基于RAII(Resource Acquisition Is Initialization,资源获取即初始化)原则实现的,这是C++管理资源的一种惯用法。

C++标准库提供了几种内置的智能指针类型,包括但不限于:

  1. std::unique_ptr:表示独占所有权的智能指针。在同一时间内,只能有一个unique_ptr指向一个给定的对象。当unique_ptr离开作用域时,它所拥有的资源会被自动删除。
  2. std::shared_ptr:支持共享所有权的智能指针。多个shared_ptr可以指向同一个对象,该对象的生命周期会持续到最后一个指向它的shared_ptr销毁。它内部维护了一个引用计数来跟踪有多少个智能指针共享同一对象,当引用计数降至零时,对象会被自动删除。
  3. std::weak_ptr:一种不增加引用计数的智能指针,主要用于解决shared_ptr可能导致的循环引用问题。weak_ptr可以观察由shared_ptr管理的对象,但不会增加对象的引用计数。它提供了一个检查对象是否仍然存在的方法,如果对象已被删除,则可以安全地避免使用悬挂的指针。

智慧指针的使用简化了内存管理,使得开发者可以更专注于程序逻辑,而不是资源管理的细节,从而提高了代码的安全性和可维护性。

改后代码

#include <memory>
std::unique_ptr<int> createHeapInt() {
    return std::make_unique<int>(5); // 动态分配并封装到unique_ptr中
}
int main() {
    std::unique_ptr<int> uptr = createHeapInt(); // 使用unique_ptr管理内存
    *uptr = 10; // 通过unique_ptr修改值,安全且有效
    std::cout << *uptr << std::endl; // 输出10
    // uptr离开作用域时,内存会自动释放,无需手动delete
}

要安全地管理这段代码中的堆内存生命周期,并避免悬挂引用的问题,你可以使用智能指针,特别是std::unique_ptr,因为它表达了独占所有权的概念,非常适合这种场景。在这个版本中,createHeapInt函数返回一个std::unique_ptr<int>,它负责自动管理分配的内存。在main函数中,我们通过uptr智能指针来持有这块内存的所有权。当我们对uptr进行赋值或它离开作用域时,智能指针会自动调用delete释放内存,避免了悬挂指针和内存泄漏的风险。同时,通过智能指针解引用或使用其提供的成员函数(如get())可以安全地访问和修改原始指针指向的值。

目录
相关文章
|
1月前
|
存储 C语言 索引
【c语言指针详解】复杂数据结构的指针用法
【c语言指针详解】复杂数据结构的指针用法
91 0
|
1月前
|
存储 C语言
【c语言指针详解】指针的基本概念和用法
【c语言指针详解】指针的基本概念和用法
86 0
|
8月前
|
C语言
通过模拟实现计算器介绍函数指针数组和回调函数的用法【C语言/指针/进阶】
通过模拟实现计算器介绍函数指针数组和回调函数的用法【C语言/指针/进阶】
54 0
|
9月前
|
程序员 C++
智能指针避坑指南——几种常见的错误用法
智能指针避坑指南——几种常见的错误用法
|
29天前
|
存储
指针用法及分类
指针用法及分类
|
1月前
|
存储 安全 程序员
【C++ 包装器类 智能指针】完全教程:std::unique_ptr、std::shared_ptr、std::weak_ptr的用法解析与优化 — 初学者至进阶指南
【C++ 包装器类 智能指针】完全教程:std::unique_ptr、std::shared_ptr、std::weak_ptr的用法解析与优化 — 初学者至进阶指南
117 0
|
1月前
|
算法 Java
快慢指针该如何操作?本文带你认识快慢指针常见的三种用法及在链表中的实战
快慢指针该如何操作?本文带你认识快慢指针常见的三种用法及在链表中的实战
31 0
|
1月前
|
安全 C++
C++智能指针的用法
C++智能指针的用法
39 0
|
7月前
|
设计模式
《QT从基础到进阶·三十二》Q指针和D指针用法
《QT从基础到进阶·三十二》Q指针和D指针用法
113 0
|
8月前
|
程序员 编译器 C语言
还在因为指针头大吗,6000字的白话让你掌握字符指针/指针数组/数组指针的用法【C语言/指针/进阶/程序员内功修炼】【上】
还在因为指针头大吗,6000字的白话让你掌握字符指针/指针数组/数组指针的用法【C语言/指针/进阶/程序员内功修炼】【上】
41 0