加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – STL擦除 – 删除习语与自定义删除操作和valgrind

发布时间:2020-12-16 10:39:53 所属栏目:百科 来源:网络整理
导读:这是尝试使用STL算法而不是手写循环等来重写一些旧的作业. 我有一个名为Database的类,它包含Vector Media *,其中Media *可以是(或其他)CD或书.数据库是唯一处理动态内存的类,当程序启动时,它会读取一个格式如下所示的文件(稍微简化),在读取条目时分配空间,将
这是尝试使用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’.

解决方法

这就是为什么你应该总是,总是使用智能指针.您遇到问题的原因是因为您使用了哑指针,将其从向量中移除,但是没有触发释放它指向的内存.相反,你应该使用一个智能指针,它总是释放指向内存,从向量中移除等于释放指向内存.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读