删除map <string,string =“”> </string,>的内存

时间:2014-03-17 13:13:32

标签: c++ memory-leaks

我有一个方法返回一个新的地图指针,后来被消耗掉了。在使用地图的地方,我有以下代码:

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,但始终是预定义的固定数量),并且地图始终包含类似的数据,通常甚至与以前完全相同。

3 个答案:

答案 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>实例可能会更好,而不是指向此类型的动态分配实例的指针...