C++ 智能指针 - 笔记

参考:C++ 智能指针 - 全部用法详解-CSDN博客

智能指针就是帮我们C++程序员管理动态分配的内存的,它会帮助我们自动释放new出来的内存,从而尽量避免内存泄漏!

如下例子就是内存泄露的例子:

#include <iostream>

#include <string>

#include <memory>

using namespace std;

// 动态分配内存,没有释放就return

void memoryLeak1() {

string *str = new string("动态分配内存!");

return;

}

// 动态分配内存,虽然有些释放内存的代码,但是被半路截胡return了

int memoryLeak2() {

string *str = new string("内存泄露!");

// ...此处省略一万行代码

// 发生某些异常,需要结束函数

if (1) {

return -1;

}

/

// 另外,使用try、catch结束函数,也会造成内存泄漏!

/

delete str; // 虽然写了释放内存的代码,但是遭到函数中段返回,使得指针没有得到释放

return 1;

}

memoryLeak1函数中,new了一个字符串指针,但是没有delete就已经return结束函数了,导致内存没有被释放,内存泄露!

memoryLeak2函数中,new了一个字符串指针,虽然在函数末尾有些释放内存的代码delete str,但是在delete之前就已经return了,所以内存也没有被释放,内存泄露!

使用指针,我们没有释放,就会造成内存泄露。但是我们使用普通对象却不会!

思考:如果我们分配的动态内存都交由有生命周期的对象来处理,那么在对象过期时,让它的析构函数删除指向的内存,这看似是一个 very nice 的方案?

  1. C++98 提供了 auto_ptr 模板的解决方案
  2. C++11 增加unique_ptr、shared_ptr 和weak_ptr

二、auto_ptr

auto_ptr 是c++ 98定义的智能指针模板,其定义了管理指针的对象,可以将new 获得(直接或间接)的地址赋给这种对象。当对象过期时,其析构函数将使用delete 来释放内存!

用法:

头文件: #include < memory >

用 法: auto_ptr<类型> 变量名(new 类型)

例 如:

auto_ptr< string > str(new string("我要成为大牛~ 变得很牛逼!"));

auto_ptr<vector< int >> av(new vector< int >());

auto_ptr< int > array(new int10);

例:

我们先定义一个类,类的构造函数和析构函数都输出一个字符串用作提示!

定义一个私有成员变量,赋值20.

再定义一个私有成员方法用于返回这个私有成员变量。

如下:

cpp 复制代码
#include <iostream>
#include <memory>

class Base {
public:
    Base() { std::cout << "Base constructor called." << std::endl; }
    ~Base() { std::cout << "Base destructor called." << std::endl; }
};

class Derived : public Base {
public:
    Derived() { std::cout << "Derived constructor called." << std::endl; }
    ~Derived() { std::cout << "Derived destructor called." << std::endl; }
};

int main() {
    
    Derived *d = new Derived();
//	std::auto_ptr<Derived> test(d);        
        
    std::cout << "After scope." << std::endl;
    return 0;
}

其中注释掉的是智能指针的接管:

运行结果如下

可知,创建对象后只执行了构造函数,程序结束后也没有主动释放;

接下来交给智能指针接管:

即去掉如上的注释:

运行结果如下:

发现程序结束前,析构函数被自动调用了

;

相关推荐
衍生星球5 小时前
【Java 语言】— 方法(方法定义、调用、参数、返回值、方法重载)
java·开发语言·方法
CodeGL5 小时前
16、Python Web开发
开发语言·前端·python
喵了几个咪6 小时前
GoWind UBA 拆解:把 Doris UNIQUE KEY 翻译成 ClickHouse——读数正确性对齐实录
开发语言·后端·clickhouse·微服务·golang·gowind
陈哈哈11116 小时前
折腾了半天,总算把 Vim 9.2 装明白了
笔记
陈哈哈11116 小时前
折腾了半天,总算把 OpenGL 的开发环境给装明白了
笔记
FRing036 小时前
JavaScript入门到精通二十九(内置构造函数(Object、Array))
开发语言·前端·javascript
syagain_zsx6 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节
小鱼仙官6 小时前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
小嘉丶学长6 小时前
Day08 · 字符串(二)
服务器·开发语言·python·学习·1024程序员节
萌动的小火苗6 小时前
MQTT的QoS0、QoS1、QoS2有什么区别?
开发语言·网络·python·php·信息与通信