在调查转储时,我正在处理由这段源代码引起的访问冲突:
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
变量来访问包装的字节数组。 (这样做将为您提供一个指向包装类的内存位置的指针,如其他人所述)
但是,它确实从GetData()
继承并覆盖 CObArray
,从而授予对包装好的数组的只读访问权限。这样,您可以将代码调整为以下内容:
CByteArray baInput;
...
BYTE* copy = new BYTE[baInput.GetSize()];
memcpy(copy, baInput.GetData(), baInput.GetSize());
但是,使用C++,更好的方法是对数据使用 vector :
CByteArray baInput;
...
std::vector<BYTE> copy(baInput.GetData(), baInput.GetData() + baInput.GetSize());
请注意,有几种方法可以将数据分配给 vector 。这将源指针视为迭代器,并且是最快的迭代器之一。您稍后也可以再次使用
std::vector::data()
访问 vector 的数据。