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



我使用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没有足够的了解(读:任何)来明确地说明改进,但很可能你想完全放弃动态分配和指针。如果可以的话,按值返回。定义有意义的移动构造函数

相关内容

最新更新