当前位置: 首页 > article >正文

std::queue的pop操作会调用对象的析构函数

今天在写代码时用到了一个内容是指针的队列,为了降低指针的维护难度,便打算用unique_ptr来维护指针。之后便在想,queue中的unique_ptr每次pop后会立即析构吗,于是便写了下面这段测试demo:

class Person
{
    int _id;

public:
    Person(int id) : _id(id) { std::cout << "* init " << _id << std::endl; }
    ~Person() { std::cout << "- free " << _id << std::endl; }
};

int main()
{
    std::queue<std::unique_ptr<Person>> people;
    people.push(std::unique_ptr<Person>(new Person(1)));
    people.push(std::unique_ptr<Person>(new Person(2)));
    people.push(std::unique_ptr<Person>(new Person(3)));
    people.push(std::unique_ptr<Person>(new Person(4)));
    people.push(std::unique_ptr<Person>(new Person(5)));
    people.push(std::unique_ptr<Person>(new Person(6)));

    for (int i = 0; i < 3; i++)
    {
        people.pop();
        std::cout << "people pop once..." << std::endl;
    }

    return 0;
}

发现每次pop之后,unique_ptr就会立即析构,后续在其它代码不变的情况下,又把unique_ptr分别换成了普通指针和普通对象,后续发现普通指针从头到死都不析构(因为没有手动析构),而换成普通对象之后就和unique_ptr一样析构了。

后续通过debug发现,queue的pop函数中调用了一个名字中含有destroy的函数:

结合之前的现象判断,这个函数就是调用待pop对象的析构函数。


http://www.kler.cn/a/443244.html

相关文章:

  • 【Ubuntu】 Ubuntu22.04搭建NFS服务
  • 《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》
  • 如何用 ESP32-CAM 做一个实时视频流服务器
  • 文献综述拆解分析
  • (二十八)Flask之wtforms库【上手使用篇】
  • 【搜索】【推荐】大 PK
  • @PostConstruct注解解释!!!!
  • 【React前端】大屏适配解决方案从框架结构到实现(超详细)(附代码)
  • Java项目--仿RabbitMQ的消息队列--网络通信协议设计
  • [BJDCTF2020]ZJCTF,不过如此 1
  • gbase8s之常用sql脚本
  • 浅谈单例模式
  • 【AI图像生成网站Golang】项目测试与优化
  • 电脑上怎么运行手机APP(电脑上运行手机APP的4种方法)
  • 深入解析java.lang.NumberFormatException异常及解决方法
  • Ubuntu交换区(Swap)扩容方法
  • linux 查找当前目录下大于10G的目录,并删除它们
  • mac电脑可以使用的模拟器
  • 网络术语MSS/MTU/TSO/Len说明
  • ABP vNext多租户配置及通过域名方式解析租户的实现
  • 构建一个rust生产应用读书笔记6-拒绝无效订阅者02
  • 深入探索Vue.js中的methods选项:事件处理与业务逻辑的核心机制
  • Android Compose Modifier
  • 简单了解一下 Go 语言的构建约束?
  • ES6中的map和set
  • PHP代码审计学习(一)--命令注入