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