Каковы первые 4 байта std :: vector? - PullRequest
0 голосов
/ 24 ноября 2018

Я хотел бы вручную прочитать значения, количество значений и емкость, выделенную для вектора.

После прочтения этого я полагал, что к std :: vector можно было получить доступ вручную через следующую структуру

struct _vector{
    DWORD* begin;
    DWORD* end;
    DWORD* tail;
};

и что я мог получить доступ к первому значению ввектор, выполнив следующее.

_vector *vec = (_vector*)vectorAddress;
DWORD first_value = vec->begin[0];

Однако вместо этого я обнаружил, что это не так.Мне нужно было добавить еще 4 байта в верхней части структуры, чтобы правильно сделать адреса доступа для начала, конца и хвоста.Ниже приведена рабочая версия того, что я хотел бы сделать.

#include <iostream>
#include <windows.h>
#include <vector>

std::vector<DWORD> vectorData;

void readVector(DWORD vectorAddress){
    struct _vector{
        DWORD* WHATISTHIS;
        DWORD* begin;
        DWORD* end;
        DWORD* tail;
    };

    _vector* vec = (_vector*)vectorAddress;

    DWORD count = ((DWORD)vec->end - (DWORD)vec->begin) / sizeof(DWORD);
    DWORD capacity = ((DWORD)vec->tail - (DWORD)vec->begin) / sizeof(DWORD);

    printf("Vector has %d items and %d capacity\n", count, capacity);

    for (int i = 0; i < count; i++)
        printf("\tValue at %d is 0x%x\n", i, vec->begin[i]);
}


int main(void){
    vectorData.reserve(3);
    vectorData.push_back(0x123456);
    vectorData.push_back(0x654321);

    while (true){
        readVector((DWORD)&vectorData);
        system("pause");
    }
}

Вывод программы:

Vector has 2 items and 3 capacity
        Value at 0 is 0x123456
        Value at 1 is 0x654321
Press any key to continue . . .

Учитывая то, что на самом деле представляют первые 4 байта моей структуры _vector?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...