【发布时间】:2016-05-05 09:26:13
【问题描述】:
我一直在从事 Qt 项目,但在删除地图中的对象时遇到了问题。我准备了一个简单的 C++ 代码来显示我的问题:
#include <iostream>
#include <map>
#include <string>
using namespace std;
class A
{
public:
int *tab;
A()
{
tab = NULL;
}
~A()
{
if (tab != NULL)
{
delete[] tab;
}
}
};
int main()
{
map<string, A> mapa;
string name = "MyArray";
A *a = new A;
a->tab = new int[3];
a->tab[0] = 1;
a->tab[1] = 2;
a->tab[2] = 3;
mapa[name] = *a;
delete a;
system("PAUSE");
return 0;
}
关闭程序后,我得到: 调试断言失败!
_BLOCK_TYPE_IS_VALID 等等。
我的问题是:为什么会这样?原因可能是在我退出程序后 map 被删除,并且它包含一个在我关闭程序之前被删除的 A 对象 (a)。但是,我传递的是一个值,而不是一个地址,那么有什么问题呢?
该值不是刚刚复制到地图中并保存在某个不同的地址中吗?
【问题讨论】:
-
我是 OT,但本着向您指出三法则的精神...我建议您阅读 Scott Meyers 的“Effective C++”系列。
-
@n.m.:我已经说过了。在答案部分。您的评论没有添加任何内容...
-
另见:Rule of Five 和 Rule of Zero。
-
@Lightness 是的,你做了,但从你的回答中不清楚 OP 到底应该做什么。太多的建议要遵循。我的评论增加了一些确定性。但如果你坚持,我可以删除它;)
标签: c++ memory-leaks