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