[英]Copying a CByteArray into an array of Bytes causes an access violation
在调查转储时,我正在处理由这段源代码引起的访问冲突:
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
包含相当多的反斜杠字符。
与其他 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()
访问向量的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.