IT评测·应用市场-qidao123.com

标题: 【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针 [打印本页]

作者: 莱莱    时间: 2023-5-21 11:29
标题: 【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针
文章首发

【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针
前言

大家好,今天是【重学C++】系列的第二讲,我们来聊聊C++的智能指针。
为什么需要智能指针

在上一讲《01 C++如何进行内存资源管理》中,提到了对于堆上的内存资源,需要我们手动分配和释放。管理这些资源是个技术活,一不小心,就会导致内存泄漏。
我们再给两段代码,切身体验下原生指针管理内存的噩梦。
  1. void foo(int n) {
  2.     int* ptr = new int(42);
  3.     ...
  4.     if (n > 5) {
  5.             return;
  6.     }
  7.     ...
  8.     delete ptr;
  9. }
  10. void other_fn(int* ptr) {
  11.         ...
  12. };
  13. void bar() {
  14.     int* ptr = new int(42);
  15.     other_fn(ptr);
  16.     // ptr == ?
  17. }
复制代码
在foo函数中,如果入参n > 5, 则会导致指针ptr的内存未被正确释放,从而导致内存泄漏。
在bar函数中,我们将指针ptr传递给了另外一个函数other_fn,我们无法确定other_fn有没有释放ptr内存,如果被释放了,那ptr将成为一个悬空指针,bar在后续还继续访问它,会引发未定义行为,可能导致程序崩溃。
上面由于原生指针使用不当导致的内存泄漏、悬空指针问题都可以通过智能指针来轻松避免。
C++智能指针是一种用于管理动态分配内存的指针类。基于RAII设计理念,通过封装原生指针实现的。可以在资源(原生指针对应的对象)生命周期结束时自动释放内存。
C++标准库中,提供了两种最常见的智能指针类型,分别是std::unique_ptr 和 std::shared_ptr。
接下来我们分别详细展开介绍。
吃独食的unique_ptr

std::unique_ptr 是 C++11 引入的智能指针,用于管理动态分配的内存。每个 std::unique_ptr 实例都拥有对其所包含对象的唯一所有权,并在其生命周期结束时自动释放对象。
创建unique_ptr对象

我们可以std::unique_ptr的构造函数或std::make_unique函数(C++14支持)来创建一个unique_ptr对象,在超出作用域时,会自动释放所管理的对象内存。示例代码如下:
[code]#include #include class MyClass {public:    MyClass() {        std::cout




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4