将CByteArray复制到Bytes数组会导致访问冲突

时间:2018-06-05 11:57:38

标签: c++ memory-management mfc

在调查转储时,我正在处理由此源代码引起的访问冲突:

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 :(得分:2)

与其他MFC类不同,CByteArray在所有其他类成员之前没有静态缓冲区,也没有解除引用运算符。因此,通过解除引用CByteArray变量无法访问包装的字节数组。 (这样做会给你一个指向包装类的内存位置的指针,正如其他人提到的那样)

然而它继承并覆盖CObArray GetData(),它授予对包装数组的只读访问权限。有了这个,您可以将代码调整为以下内容:

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()访问矢量数据。