gpt4 book ai didi

c++ - 为什么 C++ vector 会导致 oom-killer?

转载 作者:行者123 更新时间:2023-11-28 03:23:49 26 4
gpt4 key购买 nike

该代码需要查找并处理尚未在 embedded-linux 上处理的文件。getDir 用于返回目录的排序内容。下面的代码在处理几十个或可能超过 100 个文件后完美运行,但随后因 oom-killer 而死。这是使用 C++ vector (循环 vector 内的循环 vector )的糟糕方法吗?这种方法可能会导致 oom-killer 吗?有没有另一种方法可以在不爆炸的情况下起作用?每个 vector 在超出范围时不应该被销毁吗?是否需要使用 new/delete 代替?另外:用于查找内存泄漏的 valgrind 未集成到此处理器(TI DM368)的 sdk 中,但代码非常短,并且没有新语句。注意:实际代码会检查 sql 数据库中是否有已处理的文件,但这段代码仍然会导致 oom-killer,sql 代码已被注释掉,因此为了简单起见,它被忽略了。文件路径格式为/YYYYmmdd/HH/MMSS.SS.ext。

void getDir (string dir, vector<string> &files) {
...
while ((dirp = readdir(dp)) != NULL) {
files.push_back(string(dirp->d_name));
closedir(dp);
sort(files.begin(), files.end());

while (true) {
vector<string> days;
getDir(database_location, days);
for (uint d=0; d<days.size(); d++) {
vector<string> hours;
getDir(database_location+days[d], hours);
for (uint h=0; h<hours.size(); h++) {
vector<string> files;
string dir = database_location+days[d]+"/"+hours[h];
getDir(dir, files);
for (uint f=0; f<files.size(); f++) process(dir, files[f]);

最佳答案

  1. Linux OOM killer 是出了名的愚蠢。默认情况下,不要开始责备自己的代码。
  2. 你只有三个大小合理的 vector 。 (如果vector size不合理,那是因为单个dir的文件数量也不合理)。
  3. 您不需要新建/删除

由于您不打算运行多线程,请考虑使三个 vector 静态。 Hack,但可能只是工作。

关于c++ - 为什么 C++ vector 会导致 oom-killer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14691124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com