Стирание элементов из std::vector<T>
сделает недействительным итератор it
, поскольку объект std::vector<T>
будет перемещать элементы вокруг, чтобы сохранить непрерывность основного массива после удаления элемента.
К счастью, vector<T>::erase()
возвращаетновый действительный итератор, чтобы вы не пытались разыменовать неверный итератор:
DWORD buffer;
vector<memblock>::iterator it = MemoryScanner::_results.begin();
while(it != MemoryScanner::_results.end())
{
ReadProcessMemory(MemoryScanner::_hProc, (LPVOID)(*it).address,
&buffer, sizeof(buffer), NULL);
if (value != buffer)
{
it = MemoryScanner::_results.erase(it);
}
else
{
++it;
}
}
Другой способ удаления элементов в векторе
Рассматривали ли вы использование стирание-удаление идиома ?
struct RemoveNonMatches
{
public:
RemoveNonMatches(HANDLE p, DWORD v) : proc(p) val(v) {}
bool operator()(const memblock& obj)
{
DWORD buffer;
ReadProcessMemory(proc, static_cast<LPVOID>(obj.address),
&buffer, sizeof(buffer), NULL);
return (buffer != val);
}
private:
HANDLE proc
DWORD val;
};
// ...
MemoryScanner::_results.erase
(
std::remove_if
(
MemoryScanner::_results.begin(),
MemoryScanner::_results.end(),
RemoveNonMatches(MemoryScanner::_hProc, value)
),
MemoryScanner::_results.end()
);