我使用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;
}
它解决了我的内存泄漏。问题是我不明白在第一个代码中创建了多少个副本,为什么第一个代码错误,如果反序列化…函数返回一个指针
deseriallize_video是一个函数,它获取一个字符串作为输入,并返回一个指针,指向在该函数中创建的新对象
好吧,这就对了!
该对象是由new
动态分配的,之后必须由delete
取消分配。
就是这么简单。
您在示例中创建了多个对象的副本。
在这里,对象(在指针解引用之后)用于复制初始化一个名为vid
的新Video
:
Video vid = *deseriallize_video(line);
这里,假设Video_dict
是一个标准的容器,vid
被复制到它里面:
Video_dict[vid.get_name()] = vid;
(顺便说一句,你在第二个例子中把它打成了*vid
)
我们对Video
没有足够的了解(读:任何)来明确地说明改进,但很可能你想完全放弃动态分配和指针。如果可以的话,按值返回。定义有意义的移动构造函数