我最近使用Visual Leak Detector首次对我的代码进行了分析,并且它表明了向量中的泄漏,这是我没想到的。代码是这样的:
void func()
{
std::vector<MsgUnit> msgVec;
do
{
// msgVec.clear(); // do I need to do this to avoid a leak?
msgVec = m_obj->returnMsgUnitVector();
}
while (someConditionNotMet);
// process msgVec
return;
}
MsgUnit
有一个复制构造函数和析构函数。
我还没有时间进行深入测试,但快速修复似乎表明取消注释clear()
方法会消除泄漏。
我想知道标准对这种行为的评价。在分配向量之前是否需要清除向量,以避免泄漏?
答案 0 :(得分:9)
否,赋值将使目标向量值等效于源向量。它将在内部完成所需的工作,以确保不泄漏。 [假设你的类型的拷贝构造函数,赋值和析构函数不泄漏]
答案 1 :(得分:2)
MsgUnit
有一个复制构造函数和析构函数。
我猜它没有复制赋值运算符(按照Rule of Three),这就是为什么当你重新分配它们时会出现泄漏或更糟的情况。隐式生成的运算符将简单地分配每个类成员。如果其中一些成员是手动管理资源的哑指针,那么你将丢失这些指针并泄漏资源。
要么实现它,要么更好地重新设计MsgUnit
以使用智能指针(或类似的)自动管理其动态资源,而不需要使用析构函数等。
答案 2 :(得分:0)
MsgUnit还应该定义一个operator =(const MsgUnit&amp;),以完全符合STL。
答案 3 :(得分:0)
我看到您首先怀疑std::vector
类。你应该用谷歌搜索std::vector
最有可能不泄漏。在这里寻求建议/帮助时,为什么不显示您的班级?
MsgUnit有一个复制构造函数和析构函数。
是的,这只是正确的2/3。
我还没有时间进行深入测试,但快速修复似乎表明取消注释clear()方法可以消除泄漏。
您没有时间进行测试,但是时间&#34;尝试修复&#34; ?
我想知道标准对这种行为的评价。在分配向量之前是否需要清除向量,以避免泄漏?
您至少有时间阅读std::vector reference吗?