• 智能指针与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. }

  • 相关阅读:
    网课答题查题公众号助手搭建教程
    windows远程桌面登录ubuntu,黑屏闪退,
    vivo 场景下的 H5无障碍适配实践
    使用boost::geometry::union_ 合并边界(内、外):方案二
    redis 数据结构(二)
    安全技术和防火墙
    网络编程之请求分发篇:负载均衡静态调度算法、平滑轮询加权、一致性哈希、最小活跃数算法实践!
    Neo4j深度学习
    element ui 的 el-tab 当使用 router-view 时 mounted 执行了多次
    再推新品,但华为智慧屏还在等一个契机
  • 原文地址:https://blog.csdn.net/bocai1215/article/details/127578100