访问冲突C++(删除向量中的项目)

Gio*_*rje 0 c++ memory winapi vector

我试图从我用C++编写的内存扫描程序中删除不匹配的结果.最初扫描存储器时,所有结果都存储在_results矢量中.

之后,_results会再次扫描,并应删除不再匹配的项目.

错误:

.exe中0x004016f4处的未处理异常:0xC0000005:访问冲突读取位置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
    }
}
Run Code Online (Sandbox Code Playgroud)

In *_*ico 5

从a中删除元素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;
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种删除向量中项目的方法

您是否考虑过使用擦除删除习惯用法

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()
);
Run Code Online (Sandbox Code Playgroud)