【问题标题】:Need to call std::vector.clear() before assigning using operator=?在使用 operator= 进行分配之前需要调用 std::vector.clear() 吗?
【发布时间】:2013-12-26 16:06:55
【问题描述】:

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

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

【问题讨论】:

  • 这也将有助于添加与调用m_obj-&gt;returnMsgUnitVector();对应的方法声明。
  • @Wolf 尝试使用方法名来完成这项工作 =)

标签: c++ vector memory-leaks stdvector


【解决方案1】:

我看到您首先怀疑std::vector。你应该用谷歌搜索std::vector 很可能不会泄漏。为什么在此处寻求建议/帮助时不显示您的班级

MsgUnit 有一个拷贝构造函数和析构函数。

是的,这只是正确的 2/3。

我还没有时间进行深入测试,但快速修复似乎表明取消注释 clear() 方法可以消除泄漏。

您没有时间测试,但有时间“尝试并修复”

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

您至少有时间阅读std::vector reference吗?

【讨论】:

    【解决方案2】:

    MsgUnit 有一个拷贝构造函数和析构函数。

    我猜它没有复制分配运算符(根据Rule of Three),这就是为什么在重新分配它们时会出现泄漏或更糟的原因。隐式生成的运算符将简单地分配每个类成员。如果其中一些成员是指向手动管理资源的哑指针,那么您将丢失这些指针并泄漏资源。

    要么实现它,要么更好地重新设计MsgUnit 以使用智能指针(或类似的)来自动管理其动态资源,而无需您搞乱析构函数等。

    【讨论】:

    • 为什么会导致泄漏,而不是编译错误?
    • 这不会是一个错误,默认的赋值语义将由编译器实现,这在许多情况下不是程序员想要的。向量不会泄漏,但默认分配可能会导致 MsgUnit 中的动态数据泄漏。
    • @LightnessRacesinOrbit:为什么会出现编译错误?它将使用隐式复制分配运算符,这将(几乎可以肯定)对托管资源的指针做错事。
    【解决方案3】:

    MsgUnit 还应定义为完全符合 STL 的 operator=(const MsgUnit &)。

    【讨论】:

    • 或者,对于 C++11,移动赋值运算符 (operator=(MsgUnit&amp;&amp;))。
    • @DNT 你手头有遵守STL的官方参考吗?
    • @Wolf:我不明白 STL 与它有什么关系。
    • @Wolf 语言语义、快捷方式和含义... “跟随或崩溃”的感觉,但在使用 STL 容器时通常是一种被广泛接受的良好做法。
    【解决方案4】:

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

    【讨论】:

    • 他看到与clear 不同的事实表明他的赋值运算符可能存在问题(尽管我们不能确定)。
    • 啊,你让我想起了类型的赋值运算符。我没有在想,并将它与复制构造函数混淆了。去查看库的代码,确实赋值运算符忘记删除它的旧资源。
    猜你喜欢
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 2011-09-14
    • 2016-06-21
    相关资源
    最近更新 更多