gpt4 book ai didi

C++ Vector 删除特定项目,但会出现段错误

转载 作者:行者123 更新时间:2023-11-30 02:09:25 27 4
gpt4 key购买 nike

全部。我正在开发使用系统的主机文件来阻止广告的软件,但主要是代码。

我有一个自定义类 HostEntry,其中包含必要的信息,例如目标主机、要阻止的主机、目标主机的 ip 等。

在 HostsManager 类中,它保留一个 vector 来跟踪所有添加的主机。为了完全阻止主机,我必须添加 example.comwww.example.com,但是当我遍历 vector 时,它只会删除以“万维网。”留下那个没有。如果您尝试第二次删除它(只有条目缺少“www.”),它会出现段错误,我不知道为什么。

void HostsManager::delHost(std::string blockedhost) {
strip(blockedhost);
string tmp; // yes I know it's not great practice to do it like this, but it was for debug reasons
for (vector<HostEntry>::iterator viter = hosts.begin(); viter != hosts.end(); ++viter) {
tmp = viter->getHost();
if (tmp == blockedhost || tmp == ("www." + blockedhost)) {
viter = hosts.erase(viter);
}
}
}

调用该特定函数的示例:

HostsManager mgr;
mgr.delHost("mysite.com"); // this deletes "www.mysite.com" but not "mysite.com" - whether or not you call delHost() with the "www." prefix
mgr.delHost("mysite.com"); // if you call it a second time, it segfaults O.o

我们将不胜感激。

编辑:我将从对 erase() 的调用返回的值分配给 viter,结果相同。我仍然不知道为什么会这样。

如果您需要所有代码,请访问 http://paste.pocoo.org/show/363051/

最佳答案

通常最好使用 std::remove_if 从 vector 中删除多个项目;它以线性时间而不是二次方式运行,并且无需担心迭代器失效。

可能看起来像这样:

hosts.erase(std::remove_if(hosts.begin(), 
hosts.end(),
[&blockedhost](const HostEntry& entry) {
return entry.getHost() == blockedhost ||
entry.getHost() == "www." + blockedhost;
}),
hosts.end());

你可以在没有 C++0x lambdas 的情况下通过一个结构来完成类似的事情来比较:

struct RemoveBlockedHost {
RemoveBlockedHost(const std::string& s): blockedHost(s) {}
bool operator () (const HostEntry& entry) {
return entry.getHost() == blockedHost || entry.getHost() == "www." + blockedHost;
}
const std::string& blockedHost;
};

hosts.erase(std::remove_if(hosts.begin(), hosts.end(), RemoveBlockedHost(blockedhost)), hosts.end());

关于C++ Vector 删除特定项目,但会出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5494415/

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