• 智能指针与map结合使用


    背景:

            项目中,代码有个位置需要是使用智能指针进行内存管理,大概代码如下:

    1. struct DataBuffer
    2. {
    3. DataBuffer(int iRFFrameNums)
    4. :i_rf_frames(iRFFrameNums)
    5. {
    6. v_rf_buffer_one_inter.resize(i_rf_frames, nullptr);
    7. p_rf_buffer_one_inter = new(std::nothrow) uint8_t[1024 * i_rf_frames];
    8. assert(nullptr != p_rf_buffer_one_inter);
    9. for (int i = 0; i < i_rf_frames; ++i)
    10. {
    11. v_rf_buffer_one_inter[i] = p_rf_buffer_one_inter + i * 1024;
    12. }
    13. }
    14. ~DataBuffer()
    15. {
    16. assert(nullptr != p_rf_buffer_one_inter);
    17. if (nullptr != p_rf_buffer_one_inter)
    18. {
    19. delete[]p_rf_buffer_one_inter;
    20. p_rf_buffer_one_inter = nullptr;
    21. }
    22. }
    23. int i_rf_frames = 0; // RFFrame帧数
    24. uint8_t* p_rf_buffer_one_inter = nullptr;
    25. std::vector<uint8_t*> v_rf_buffer_one_inter;
    26. };
    27. int main()
    28. {
    29. std::deque m_DataBufferQueue;
    30. DataNode node;
    31. {
    32. auto data = make_shared(10);
    33. node.insert(make_pair("aaa", data));
    34. m_DataBufferQueue.push_back(node);
    35. auto data1 = std::make_shared(10);
    36. node.insert(std::make_pair("aaa", data1));
    37. m_DataBufferQueue.push_back(node);
    38. }
    39. }

    运行main的时候,总是会执行内存释放,本来觉得很奇怪,本来思路:

    (其实真实项目代码里面,这个node是个成员变量,data和data1的申请,是通过外部触发执行的,这里简单起见,直接写了)

    1. data申请完内存,和一个string组合一个键值对,将这个键值对维护到deque队列里面,供后续使用。

    2. data1申请一个内存,同样和string组合成一个键值对,并将这个结果维护到deque中,到这里,就会出现出了里面那个“}”,就会释放内存

    问题:我不是已经将他维护到dequeue里面了,为什么还会释放,不应该呀?

    答:

            其实是insert的问题

            insert 含义是:

      如果key存在,则插入失败,如果key不存在,就创建这个key-value。

    如果上面data1插入map失败的话,那相当于data1没有被维护起来,那出了作用域,必然会被释放

    解决方法:

           利用下标操作

            含义是:

      如果这个key存在,就更新value;如果key不存在,就创建这个key-value对

      实例:map[key] = value

    1. int main()
    2. {
    3. std::deque m_DataBufferQueue;
    4. DataNode node;
    5. {
    6. auto data = make_shared(10);
    7. node["aaa"] = data;
    8. m_DataBufferQueue.push_back(node);
    9. auto data1 = std::make_shared(10);
    10. node["aaa"] = data1;
    11. m_DataBufferQueue.push_back(node);
    12. }
    13. }

  • 相关阅读:
    【unity2023打包安卓工程】踩坑记录
    如何使用MATLAB写测试(3)combinatorial explosion? 参数化!
    Win7下设置“定时关机”的方法
    transformer模型训练结构解析(加深理解)
    win10 磁盘命令 修复磁盘硬盘
    0203高阶导数-导数与微分-高等数学
    springboot---任务---整合quartz与task----定时任务(详细)
    云安全之HTTP协议介绍
    什么是虚拟DOM(Virtual DOM)?它在前端框架中的作用是什么?
    Prometheus - 系统监控与警报管理
  • 原文地址:https://blog.csdn.net/bocai1215/article/details/127578100