Копирование CByteArray в массив байтов вызывает нарушение прав доступа - PullRequest
0 голосов
/ 05 июня 2018

Во время исследования дампа я имею дело с нарушением доступа, вызванным этим фрагментом исходного кода:

CByteArray baInput;
... // baInput gets filled in with 9804 entries
BYTE* result;
result = new BYTE[baInput.GetSize()]; // baInput.GetSize() yields 9804, as expected.
memcpy (result, &baInput, baInput.GetSize()); // access violation

Чтобы понять, что происходит, я добавил sizeof(result) всмотровое окно, которое выдает 8 (хотя я ожидал 9804), но я не уверен, правильно ли это здесь делать.

Я бы хотел быть действительно уверенным, что броньпамяти для переменной result успешно выполнена.Как я могу это сделать?

У кого-нибудь есть идеи, что здесь может пойти не так?
Заранее спасибо

О, я забыл: я работаю в среде Windows,скорее всего, Windows-10.
Среда программирования основана на наборах Windows версии 8.1.
CByteArray - это код MFC.

Не знаю, так ли этоимеет значение, но CByteArray содержит довольно много символов обратной косой черты.

1 Ответ

0 голосов
/ 05 июня 2018

В отличие от других классов MFC, CByteArray не содержит ни статического буфера перед всеми остальными членами класса, ни оператора разыменования.Таким образом, обернутый байтовый массив не может быть доступен путем разыменования переменной CByteArray.(Это даст вам указатель на место в памяти класса-оболочки, как уже упоминалось)

Однако он наследует и переопределяет GetData() из CObArray, что предоставляет доступ только для чтенияв завернутый массив.При этом вы можете настроить свой код следующим образом:

CByteArray baInput;
...
BYTE* copy = new BYTE[baInput.GetSize()];
memcpy(copy, baInput.GetData(), baInput.GetSize());

Однако, используя C ++, лучше использовать вектор для данных:

CByteArray baInput;
...
std::vector<BYTE> copy(baInput.GetData(), baInput.GetData() + baInput.GetSize());

Обратите внимание, что существует несколькоспособы присвоения данных вектору.Этот обрабатывает исходные указатели как итераторы и является одним из самых быстрых.Вы также можете получить доступ к данным вектора, используя std::vector::data() позже.

...