作为练习,我正在尝试从我用 C++ 编写的内存扫描器中删除不匹配的结果。最初扫描内存时,所有结果都存储到 _results
vector 中。
稍后,再次扫描 _results
并删除不再匹配的项目。
错误:
Unhandled exception at 0x004016f4 in .exe: 0xC0000005: Access violation reading location 0x0090c000.
// Receives data
DWORD buffer;
for (vector<memblock>::iterator it = MemoryScanner::_results.begin(); it != MemoryScanner::_results.end(); ++it) {
// Reads data from an area of memory into buffer
ReadProcessMemory(MemoryScanner::_hProc, (LPVOID)(*it).address, &buffer, sizeof(buffer), NULL);
if (value != buffer) {
MemoryScanner::_results.erase(it); // where the program breaks
}
}
最佳答案
从 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;
}
}
另一种删除 vector 中项目的方法
您是否考虑过使用 erase-remove idiom ?
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()
);
关于c++ - 访问冲突 C++(删除 vector 中的项目),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4687731/