- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 std::remove_if
函数有一点疑问。我的程序某处发生内存泄漏,我怀疑 erase
函数被破坏了。
实际上,我的代码中有这个
std::vector<Object*> v; // Just the constructor to show you
v.erase(std::remove_if(begin(v), end(v), [Foo f](Object *o){
return o->containsFoo(f);
}), end(v));
但是经过一些研究,这个比之前的好吗?
v.erase(std::remove_if(begin(v), end(v), [Foo f](Object *o){
if(o->containsFoo(f)) {
delete o;
return true;
}
return false;
}), end(v));
或者我应该使用其他东西吗?
最佳答案
你真的应该使用智能指针而不是裸露的Object*
- 要么
std::vector<std::unique_ptr<int>>
或
std::vector<std::shared_ptr<int>>
以合适的为准。如果您使用裸 C 风格指针,很容易错过关键的 delete
(或 delete
两次)。
尽管如此,很容易看出一种方法会泄漏而另一种不会:
#include <algorithm>
#include <vector>
int main(int argc, char **)
{
std::vector<int*> v{ new int(1), new int(-1) };
if (argc < 2) {
// First version
v.erase(std::remove_if(begin(v), end(v),
[](int *o){
return *o < 0;
}),
end(v));
} else {
// Second version
v.erase(std::remove_if(begin(v), end(v),
[](int *o){
if (*o < 0) {
delete o;
return true;
}
return false;
}),
end(v));
}
// normal cleanup
for (int *p: v)
delete p;
}
我在没有参数(调用第一个版本)的情况下运行它,然后使用参数(调用第二个版本)运行它。看看会发生什么:
g++ -std=c++11 -g -Wall -Wextra 34191606.cpp -o 34191606
valgrind --leak-check=full ./34191606
==16894== HEAP SUMMARY:
==16894== in use at exit: 72,708 bytes in 2 blocks
==16894== total heap usage: 4 allocs, 2 frees, 72,728 bytes allocated
==16894==
==16894== 4 bytes in 1 blocks are definitely lost in loss record 1 of 2
==16894== at 0x4C2B0E0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16894== by 0x400881: main (34191606.cpp:6)
==16894==
==16894== LEAK SUMMARY:
==16894== definitely lost: 4 bytes in 1 blocks
==16894== indirectly lost: 0 bytes in 0 blocks
==16894== possibly lost: 0 bytes in 0 blocks
==16894== still reachable: 72,704 bytes in 1 blocks
==16894== suppressed: 0 bytes in 0 blocks
==16894== Reachable blocks (those to which a pointer was found) are not shown.
==16894== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
valgrind --leak-check=full ./34191606 -
==16895== HEAP SUMMARY:
==16895== in use at exit: 72,704 bytes in 1 blocks
==16895== total heap usage: 4 allocs, 3 frees, 72,728 bytes allocated
==16895==
==16895== LEAK SUMMARY:
==16895== definitely lost: 0 bytes in 0 blocks
==16895== indirectly lost: 0 bytes in 0 blocks
==16895== possibly lost: 0 bytes in 0 blocks
==16895== still reachable: 72,704 bytes in 1 blocks
==16895== suppressed: 0 bytes in 0 blocks
==16895== Reachable blocks (those to which a pointer was found) are not shown.
==16895== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
请注意,在第一个版本中,您永远不会删除从 vector 中删除其指针的对象,并且该对象被报告为泄漏。在第二个版本中,没有内存泄漏。
关于c++ - 在充满指针的 std::vector 上使用 std::remove_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34191606/
我有一个 Storm 拓扑,其中一个 bolt 应该与ElasticSearch交互。 public static Client client; public static Settings sett
我目前正在开发 LIMS。我需要检索与需要使用某种准备方法准备的实验室 sample 相关的信息。 (我对此进行了相当多的简化,因此对任何错误表示歉意。)我需要在查询结果中生成的列是: Sample
我必须以下文件夹结构: main - server -- server-module-1 --- a --- b --- c -- server-module-2 --- d --- e --- f
Tomcat 和我的自定义 JAAS LoginModule 运行良好,但每次我输入错误的凭据时,整个 LoginException 都会写入日志。根据定义,LoginModule 必须在身份验证失败
我一直在关注有关 iOS 开发的教程 - 特别是向下钻取 UITableViews。我建立了自己的自定义 plist,但我似乎无法让 DetailViewController 填充我的 plist 信
我对 QT 比较陌生。在我的代码中,我创建了一个 QTableWidget,遍历行并将单元格设置为 QLineEdits 和 QCheckBoxes。我想这样做,以便更改任何 QLineEdits 中
我刚开始使用 Chrome 的分析器。所以这可能是对我得到的结果的误解。 如果我打开 Chrome 分析器并拍摄以下网页的堆快照,我会注意到 obj3 的保留大小是 obj1 和 obj2 的保留大小
我正在尝试使用 Python 2.7 中的 BeautifulSoup 4 解析 youtube 评论。当我尝试播放任何 YouTube 视频时,我会收到充满 BOM 的文本,而不仅仅是在文件开头:
我有此消息的完整系统日志: mysqld[963]: 2016-10-23 20:54:14 140708269390592 [警告] 拒绝用户 ''@'localhost' 访问(使用密码:NO)
我有一个数组,里面装满了NSDictionaries。我想找到其中一本字典的 index,但我对这本字典的了解只是键 @"name"的 value。我该怎么做 ? 最佳答案 在 theArray 中查
我想在之前的div内容满了文字的时候显示div,然后继续用剩下的文字填充这个新的div。 我不知道怎么办。事实上,在下面的代码中我写道,div 是在单击按钮时显示的。我也无法设置上面解释的“填充操作”
这是发生了什么: 内部数据库内容:一个类有一个字符串属性,用于存储电话号码。这个数字是使用代码设置的 CFBridgingRelease(ABMultiValueCopyValueAtIndex(AB
我的 logcat 中收到了数千条以下警告消息,它挤掉了我实际要查找的消息: W/ActivityManager﹕ Wtf, activity ActivityRecord{4338cd90 u0 u
我尝试使用 mongoimport 在 mongodb 中导入单个 csv 文件,使用 mongoimport -d mydb -c things --type csv --file location
我的 Rails 开发日志中有大量这样的行: Started GET "/assets/services.css?body=1" for 127.0.0.1 at 2012-11-26 02:27:4
我在 Xcode 8/iOS 10/Swift 3 中遇到 Firebase 问题。试图让 Firebase Analytics 全部设置好。但是在 iOS10 中,控制台会记录来自 Firebase
我的 logcat 中充满了以下消息 - E/UsDebuggingManager( 476): java.io.IOException: Connection refused E/UsDebugg
总结 我有各种单节点 Kubernetes 集群,这些集群在累积约 300 个已完成的作业后变得不稳定。 例如,在一个集群中,有 303 个已完成的作业: root@xxxx:/home/xxxx#
我是一名优秀的程序员,十分优秀!