c++ - 访问冲突 C++(删除 vector 中的项目)

标签 c++ winapi memory vector

作为练习,我正在尝试从我用 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/

相关文章:

c++ - 带有对象指针的运算符函数

c - 从 C 中的 typedef 中减去一个值?

c# - 如何检测 Windows 是否要休眠或挂起?

php - 如何减少 Debian 9 中的 PHP FPM 和 MySQL 内存使用

php - 在 PHP 中,对于代码 "$a=' a';$b=$a;"分配 2 个单位的内存还是 1 个单位?

c++ - Clang - 将 C header 编译为 LLVM IR/位码

c++ - 文件名、目录名或卷标语法是来自 qt creator c++ 的不正确系统调用

c++ - Matlab 中 'textscan' 函数的 C++ 翻译是什么?

c++ - 存储此指针以在WndProc中使用的最佳方法

android - 使用已完成的 Activity 和低 kb 图像获取 OutofMemoryError/InvocationTargetException?