修复了我的内存泄漏,我不明白为什么它有效

时间:2015-08-19 21:55:22

标签: c++ memory-leaks

我使用CRT工具查找代码中的内存泄漏,当我发现我修复了一件事并处理了内存泄漏时,我无法理解那里发生的事情。

我原来的代码是:

while (getline(inf, line))
{
    Video vid = *deserialize_video(line);
    Video_dict[vid.get_name()] = vid;

}

其中deserialize_video是一个函数,它将字符串作为输入并返回指向在该函数中创建的新对象的指针,即vid类型。 我想说的是这个功能以:

结束
  

返回新视频(姓名,年份,类型,价格,长度,流派);

经过几次尝试后,我最终得到了这段代码:

while (getline(inf, line))
{
    Video * vid = deseriallize_video(line);
    Video_dict[vid->get_name()] = *vid;
    delete vid;

}

它解决了我的内存泄漏问题。问题是我无法理解在第一个中创建了多少重复项,如果deserialize ...函数发回指针,为什么第一个代码错误。

1 个答案:

答案 0 :(得分:4)

  

deseriallize_video是一个函数,它将字符串作为输入并返回指向在该函数中创建的新对象的指针

嗯,你去吧!

该对象是使用new动态分配的,后来必须使用delete取消分配。

就这么简单。

您在示例中制作了该对象的多个副本。

此处,对象(在指针解除引用后)用于复制初始化名为Video的新vid

Video vid = *deseriallize_video(line);

在这里,假设Video_dict是标准容器或等同于一个,vid被复制到其中:

Video_dict[vid.get_name()] = vid;

(顺便说一下,你在第二个例子中将其错误提交到*vid。)

我们对Video有足够的知识(读取:任何内容)以明确说明改进,但您可能希望完全放弃动态分配和指针。如果可以,按价值返回。如果必须,定义有意义的移动构造函数。