我使用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 ...函数发回指针,为什么第一个代码错误。
答案 0 :(得分:4)
deseriallize_video是一个函数,它将字符串作为输入并返回指向在该函数中创建的新对象的指针
嗯,你去吧!
该对象是使用new
动态分配的,后来必须使用delete
取消分配。
就这么简单。
您在示例中制作了该对象的多个副本。
此处,对象(在指针解除引用后)用于复制初始化名为Video
的新vid
:
Video vid = *deseriallize_video(line);
在这里,假设Video_dict
是标准容器或等同于一个,vid
被复制到其中:
Video_dict[vid.get_name()] = vid;
(顺便说一下,你在第二个例子中将其错误提交到*vid
。)
我们对Video
有足够的知识(读取:任何内容)以明确说明改进,但您可能希望完全放弃动态分配和指针。如果可以,按价值返回。如果必须,定义有意义的移动构造函数。