将 CByteArray 复制到字节数组中会导致访问冲突



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

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

为了了解发生了什么,我在监视窗口中添加了sizeof(result),这会产生8(而我预计 9804(,但我不确定这是否是正确的做法。

我想真正确定已成功执行result变量的内存预留。我该怎么做?

有人知道这里可能出了什么问题吗?
提前致谢

哦,我忘了:我正在开发Windows环境,很可能是Windows-10.
编程环境基于Windows工具包,版本8.1.
CByteArray是MFC代码。

我不知道这是否相关,但CByteArray包含相当多的反斜杠字符。

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

最新更新