背景:
项目中,代码有个位置需要是使用智能指针进行内存管理,大概代码如下:
- struct DataBuffer
- {
- DataBuffer(int iRFFrameNums)
- :i_rf_frames(iRFFrameNums)
- {
- v_rf_buffer_one_inter.resize(i_rf_frames, nullptr);
-
- p_rf_buffer_one_inter = new(std::nothrow) uint8_t[1024 * i_rf_frames];
- assert(nullptr != p_rf_buffer_one_inter);
-
- for (int i = 0; i < i_rf_frames; ++i)
- {
- v_rf_buffer_one_inter[i] = p_rf_buffer_one_inter + i * 1024;
- }
- }
-
- ~DataBuffer()
- {
- assert(nullptr != p_rf_buffer_one_inter);
-
- if (nullptr != p_rf_buffer_one_inter)
- {
- delete[]p_rf_buffer_one_inter;
- p_rf_buffer_one_inter = nullptr;
- }
- }
-
- int i_rf_frames = 0; // RFFrame帧数
- uint8_t* p_rf_buffer_one_inter = nullptr;
- std::vector<uint8_t*> v_rf_buffer_one_inter;
- };
-
-
- int main()
- {
- std::deque
m_DataBufferQueue; - DataNode node;
- {
- auto data = make_shared
(10); - node.insert(make_pair("aaa", data));
- m_DataBufferQueue.push_back(node);
-
- auto data1 = std::make_shared
(10); - node.insert(std::make_pair("aaa", data1));
- m_DataBufferQueue.push_back(node);
- }
- }
运行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
- int main()
- {
- std::deque
m_DataBufferQueue; - DataNode node;
- {
- auto data = make_shared
(10); - node["aaa"] = data;
- m_DataBufferQueue.push_back(node);
-
- auto data1 = std::make_shared
(10); - node["aaa"] = data1;
- m_DataBufferQueue.push_back(node);
- }
- }