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)
从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)