用户国营 发表于 2023-5-21 11:27:53

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

文章首发

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

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

在上一讲《01 C++如何进行内存资源管理》中,提到了对于堆上的内存资源,需要我们手动分配和释放。管理这些资源是个技术活,一不小心,就会导致内存泄漏。
我们再给两段代码,切身体验下原生指针管理内存的噩梦。
void foo(int n) {
    int* ptr = new int(42);
    ...
    if (n > 5) {
          return;
    }
    ...
    delete ptr;
}


void other_fn(int* ptr) {
        ...
};
void bar() {
    int* ptr = new int(42);
    other_fn(ptr);
    // ptr == ?
}在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对象,在超出作用域时,会自动释放所管理的对象内存。示例代码如下:
#include #include class MyClass {public:    MyClass() {      std::cout
页: [1]
查看完整版本: 【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针