c – STL擦除 – 删除习语与自定义删除操作和valgrind
这是尝试使用STL算法而不是手写循环等来重写一些旧的作业.
我有一个名为Database的类,它包含Vector< Media *>,其中Media *可以是(或其他)CD或书.数据库是唯一处理动态内存的类,当程序启动时,它会读取一个格式如下所示的文件(稍微简化),在读取条目时分配空间,将它们添加到上面的向量(v_). CD Artist Album Idnumber Book Author Title Idnumber Book ... ... 使用手写循环时删除这些对象可以正常工作:编辑:对不起我说得太快了,它本身并不是一个’手写’循环..我一直在编辑项目来删除手写循环这实际上使用了find_if算法和手动删除,但问题是有效的. /编辑. typedef vector< Media *> :: iterator v_iter; ... void Database::removeById(int id) { v_iter it = find_if(v_.begin(),v_.end(),Comparer(id)); if (it != v_.end()) { delete *it; v_.erase(it); } } 这应该是非常明显的 – 如果找到与参数匹配的id,则仿函数返回true,并且对象被销毁.这工作和valgrind报告没有内存泄漏,但由于我想使用STL,显而易见的解决方案应该是使用擦除删除习惯用法,导致如下所示 void Database::removeById(int id) { v_.erase(remove_if(v_.begin(),Comparer(id)),v_.end()); }; 然而,根据valgrind,这会“起作用”但会导致内存泄漏,那么是什么呢?第一个版本工作正常,没有任何泄漏 – 而这个版本总是为我删除的每个Media对象显示3个allocs’not freed’. 解决方法
这就是为什么你应该总是,总是使用智能指针.您遇到问题的原因是因为您使用了哑指针,将其从向量中移除,但是没有触发释放它指向的内存.相反,你应该使用一个智能指针,它总是释放指向内存,从向量中移除等于释放指向内存.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |