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

  • 相关阅读:
    雷军的开源情怀
    C. Binary Strings are Fun
    好看的货架效果(含3D效果)
    C++11改动
    Spring Cloud学习笔记(Ribbon):Ribbon的应用样例
    Redis 命令工具
    Edexcel A-Level化学真题讲解(2)
    1706D1 - Chopping Carrots (Easy Version)
    苏宁滑块验证
    MQTT的认识(1)
  • 原文地址:https://blog.csdn.net/bocai1215/article/details/127578100