在使用运算符=进行赋值之前,需要调用std::vector.clear()
Need to call std::vector.clear() before assigning using operator=?
我最近第一次用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。
相关文章:
- 为什么 std::unique 不调用 std::sort?
- std::cout.imbue()多重调用
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 使用 std::variant<...时调用 BaseState 函数而不是派生函数>
- 类型擦除的std::function与虚拟函数调用的开销
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- std::调用,未找到匹配的重载函数
- 线程 std::调用未知类型,无法专门化函数错误
- 如何使用 std:: 调用函数中的函数?
- 使用经典重载解析规则创建依赖于 std::调用的重载集类
- std::调用 end() 时出现多映射错误
- std::调用函数时找不到函数构造函数
- std::调用没有匹配的重载函数在VS 2015中发现错误