C ++现有数组的子数组偏移量

时间:2016-04-24 16:24:43

标签: c++ arrays pointers

我想创建一个从原始数组偏移而不复制内容的子数组。

byte* arr = new byte[4];
//0...3 meaning 0 through 3
arr[0...3] = 1...4

byte* subarr = arr+2;

这样subarr[0]等于3.这实际上确实有效;如果我打印subarr[0]我得到3.但是如果我想在memcpy()这样的函数中使用它,我会收到错误:

实际上没有错误消息,但断点位于free_base.cpp中。我的代码中的断点位于memcpy。实际用例是:

byte* tempbuffer = new byte[size+2];
ReadProcessMemory(processHandle, (PBYTE*)(moduleStart + offset - 1), tempbuffer, size+2, 0);

byte* subbuffer = tempbuffer + 1;
assert(subbuffer[0] == tempbuffer[1]);
memcpy(out_buffer, subbuffer, size);

delete[] subbuffer;
delete[] tempbuffer;

我知道这个例子中的子数组是多余的,因为我可以将缓冲区传递给ReadProcessMemory,但这只是为了找到错误。如果我将out_buffer(这是一个LPVOID)直接传递给ReadProcessMemory,我会得到有效的结果并且没有错误。此外,如果我在memcpy(原始数组)上使用tempbuffer,它也会给我我想要的没有错误。因此,错误必须由子数组引起并在其上使用memcpy

为什么会发生这种情况?我可以做些什么呢?

感谢。

1 个答案:

答案 0 :(得分:1)

关于子缓冲区的代码很好,调试器中发生错误的原因是因为您正在子缓冲区上调用delete []。您不应该这样做,只需要在tempbuffer上删除[],因为这是用new创建的唯一变量。我测试了您的代码并对此进行了验证。