все.Я работаю над программным обеспечением для блокировки рекламы с помощью системного файла hosts, но с кодом.
У меня есть пользовательский класс HostEntry
, который содержит необходимую информацию, такую как целевой хост, хост для блокировки,IP-адрес целевого хоста и т. д.
В классе HostsManager он хранит вектор для отслеживания всех добавленных хостов.Чтобы полностью заблокировать хост, я должен добавить example.com
AND www.example.com
, но когда я перебираю вектор, он удалит только запись, начинающуюся с «www».и оставляет один без.Если вы попытаетесь удалить его во второй раз (при этом только в записи отсутствует «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/