我真的被这个C++错误卡住了:
template<typename T>
void Shift(T* Data, const ulong& Length, long Offset) const
{
if((!Data) || (!Length))
return;
if(Offset < 0)
Offset = (Length-1) - ((-Offset-1) % Length);
else
Offset %= Length;
if(!Offset)
return;
int TSize = sizeof(T);
T* Shifter = new T[Length];
if(Shifter)
{
memcpy(Shifter, Data + TSize * Offset, TSize * (Length - Offset));
memcpy(Shifter + TSize * (Length - Offset), Data, TSize * Offset); //fails
memcpy(Data, Shifter, TSize * Length);
delete[] Shifter;
}
}
失败是:
77CD0575 ntdll!TpWaitForAlpcComplete()(C:\Windows\system32\ntdll.dll:?)
0028D640??()(??:?)
77CB57C2 ntdll!RtlLargeIntegerDivide()(C:\Windows\system32\ntdll.dll:?)
003E1030??()(??:?)
77C92A8A ntdll!RtlCopyExtendedContext()(C:\Windows\system32\ntdll.dll:?)
()(??:?)
T是短的字节,顺便说一句,
你的指针算法错了。比方说:
T* p = new T[10];
要到达第n个元素,必须使用
T* nth = p + n;
在你的memcpy论点中,你像一样使用它
T* nth = p + sizeof(T) * n;
这有时显然是越界的。
在memcpy中,您使用的是Data+Offset*TSize,当您在int的情况下说Data+1时,这是不正确的,它实际上需要4个字节,所以在指针的情况下不必指定TSize。像这个一样修改你的memcpy代码
memcpy(Shifter, Data + Offset, TSize * (Length - Offset));
memcpy(Shifter + (Length - Offset), Data, TSize * Offset); //fails if TSize is greater than 1
memcpy(Data, Shifter, TSize * Length);
Timbo 更好地解释