智能指针与map结合使用

背景:

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

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<DataNode> m_DataBufferQueue;
	DataNode node;
    {
        auto data = make_shared<DataBuffer>(10);
		node.insert(make_pair("aaa", data));
		m_DataBufferQueue.push_back(node);

		auto data1 = std::make_shared<DataBuffer>(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 含义是:

扫描二维码关注公众号,回复: 15189787 查看本文章

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

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

解决方法:

       利用下标操作

        含义是:

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

  实例:map[key] = value

int main()
{
	std::deque<DataNode> m_DataBufferQueue;
	DataNode node;
    {
        auto data = make_shared<DataBuffer>(10);
		node["aaa"] = data;
		m_DataBufferQueue.push_back(node);

		auto data1 = std::make_shared<DataBuffer>(10);
		node["aaa"]  = data1;
		m_DataBufferQueue.push_back(node);
    }
}

猜你喜欢

转载自blog.csdn.net/bocai1215/article/details/127578100