我有一个方法返回一个新的地图指针,后来被消耗掉了。在使用地图的地方,我有以下代码:
void Updater::set_data(map<string, string> * data)
{
if (this->data != NULL)
{
delete this->data;
}
this->data = data;
}
只要应用程序正在运行,此消费者就会运行。
然而,我的应用程序正在泄漏内存,Valgrind报告它正在泄漏(1个块中的600个(48个直接,552个间接)字节在丢失记录中明确丢失...)在构造图:
map<string, string> * values = new map<string, string>();
我做错了什么来摆脱地图(并释放内存)?我没有太多的C ++经验,所以我猜这是一些初学者的错误,但我花费了大量的时间来试图弄清楚它可能是什么。
修改 我只运行了2个更新程序(如果我选择了这个更新程序,则为1,但始终是预定义的固定数量),并且地图始终包含类似的数据,通常甚至与以前完全相同。
答案 0 :(得分:5)
这里有一些解决方案(如果确实没有删除最后一张地图):
在delete data;
的析构函数中添加Updater
。
用指针&#34;替换&#34;使用&#34;按值&#34;实现实施(更好)。
声明:
class Updater {
std::map<std::string,std::string> data; // not a pointer
//...
};
实现:
void Updater::set_data(map<string, string> data) // <-- by value, not by pointer
{
this->data = std::move(data);
}
客户代码:
Updater u; // updater instance
map<string, string> values;
// fill values here
u.set_data(std::move(values));
答案 1 :(得分:4)
根据您告诉我们的内容,您在程序运行时删除了中间地图,但在程序关闭之前,您永远不会删除您创建的最后一个。这可能是你错过的。如果您使用智能指针,这一切都会消失。
答案 2 :(得分:2)
第1步 - 确保在每个构造函数中设置data = NULL
,例如:
Updater::Updater()
{
data = NULL;
}
步骤#2 - 添加析构函数:
Updater::~Updater()
{
if (data != NULL)
{
delete data;
}
}
顺便说一句,正如上面的一些评论中所建议的那样,使用静态分配的map<string,string>
实例可能会更好,而不是指向此类型的动态分配实例的指针...