Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 修复了我的内存泄漏,我不明白它为什么会工作_C++_Memory Leaks - Fatal编程技术网

C++ 修复了我的内存泄漏,我不明白它为什么会工作

C++ 修复了我的内存泄漏,我不明白它为什么会工作,c++,memory-leaks,C++,Memory Leaks,我使用CRT工具在我的代码中查找内存泄漏,当我发现我修复了一件事,它处理了内存泄漏,但我不明白那里发生了什么 我最初的代码是: while (getline(inf, line)) { Video vid = *deserialize_video(line); Video_dict[vid.get_name()] = vid; } 其中,反序列化_video是一个函数,它获取一个字符串作为输入,并返回指向该函数中创建的新对象vid type的指针。 我想说的是,函数的结尾是:

我使用CRT工具在我的代码中查找内存泄漏,当我发现我修复了一件事,它处理了内存泄漏,但我不明白那里发生了什么

我最初的代码是:

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

}
其中,反序列化_video是一个函数,它获取一个字符串作为输入,并返回指向该函数中创建的新对象vid type的指针。 我想说的是,函数的结尾是:

返回新的视频名称、年份、类型、价格、长度、类型

经过几次尝试,我最终得到了以下代码:

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

}
它解决了我的内存泄漏问题。问题是我无法理解第一个代码中创建了多少个副本,如果反序列化。。。函数发回一个指针

反序列化视频是一个函数,它获取字符串作为输入,并返回指向在该函数中创建的新对象的指针

好了,给你

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

就这么简单

您在示例中复制了多个对象

这里,指针解除引用后的对象用于复制并初始化名为vid的新视频:

在这里,假设Video_dict是一个标准容器或与之等效的容器,则vid被复制到其中:

Video_dict[vid.get_name()] = vid;
顺便说一句,你在第二个例子中把它打错了


我们没有足够的了解:任何关于视频的内容都无法明确地说明改进,但很可能您希望完全放弃动态分配和指针。如果可以,请按值返回。如果必须,请定义有意义的移动构造函数。

当您调用一个函数,它返回一个指针并赋予您该指针的所有权时,您可以删除它。由于您没有删除它,所以导致内存泄漏。我们对视频、视频记录或反序列化视频一无所知,但我可以大胆猜测,不删除分配的对象是导致内存泄漏的原因。这两个代码段之间的区别在于,第二个代码段将数组的索引设置为存储在地址值处的数据,而第一个代码段将数组的索引设置为实际地址值本身。也许可以研究一下删除的作用。谢谢你的帮助。我不想添加更多的代码,因为我担心我会很难解释我做了什么/试图做什么,问题不会很清楚。我尝试了你的建议,并改为FUNCTION按值返回>返回视频名称、年份、类型、价格、长度、类型;现在代码是:Video vid=反序列化\u videoline;视频记录[vid.get\u name]=vid;这样更正确吗?@maor:我之前说过,在不知道视频的作用的情况下,不能明确地陈述任何事情。。。并没有因为你给出了不解释视频功能的理由而神奇地改变。
Video_dict[vid.get_name()] = vid;