这是使用 STL 算法而不是手写循环之类的重写一些旧作业的尝试。
我有一个名为 Database 的类,它包含一个Vector<Media *>
,其中 Media * 可以是(除其他外)一张 CD 或一本书。数据库是唯一处理动态内存的类,当程序启动时,它会读取如下格式的文件(有些简化),在读取条目时分配空间,并将它们添加到上面的向量 (v_) 中。
光盘 艺术家 专辑 身份证号 书 作者 标题 身份证号 书 ... ...
使用手写循环时,删除这些对象按预期工作: 编辑:对不起,我说得太早了,这实际上并不是一个“手写”循环本身。我一直在编辑项目以删除手写循环这实际上使用了 find_if 算法和手动删除,但问题一直有效。/编辑。
typedef vector<Media *>::iterator v_iter;
... 无效数据库::removeById(int id) { v_iter it = find_if(v_.begin(), v_.end(), Comparer(id)); 如果(它!= v_.end()){ 删除它; v_.erase(它); } }
这应该是不言自明的——如果函子找到与参数匹配的 id,则函子返回 true,并且对象被销毁。这有效,valgrind 报告没有内存泄漏,但由于我想使用 STL,明显的解决方案应该是使用擦除删除成语,导致如下所示
无效数据库::removeById(int id) { v_.erase(remove_if(v_.begin(), v_.end(), Comparer(id)), v_.end()); };
然而,这“有效”但根据 valgrind 会导致内存泄漏,那么给出了什么?第一个版本运行良好,完全没有泄漏——而这个版本总是为我删除的每个 Media 对象显示 3 个“未释放”的分配。