在使用运算符=进行赋值之前,需要调用std::vector.clear()

Need to call std::vector.clear() before assigning using operator=?

本文关键字:std 调用 vector clear 运算符 赋值      更新时间:2023-10-16

我最近第一次用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()方法的注释可以消除泄漏。

我想知道标准对这种行为有什么规定。在分配给向量之前,我是否需要清除向量,以避免泄漏?

否,赋值将使目标向量值等于源向量。它将在内部做它需要做的事情,以确保这一点不会泄漏。[假设您类型的复制构造函数、赋值和析构函数没有泄漏]

MsgUnit有一个复制构造函数和析构函数。

我想它没有副本分配运算符(根据"三条规则"),这就是为什么在重新分配时会出现泄漏或更糟的情况。隐式生成的运算符将简单地分配每个类成员。如果其中一些成员是指向手动管理资源的愚蠢指针,那么您将丢失这些指针并泄漏资源。

要么实现这一点,要么更好的是,重新设计MsgUnit,使用智能指针(或类似的指针)自动管理其动态资源,而无需使用析构函数等。

MsgUnit还应该定义一个运算符=(const MsgUnit&),以完全符合STL。