我真的遇到了这个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!TpWaitForAlpcCompletion()(C:\ Windows \ system32 \ ntdll.dll:??)
0028D640 ?? ()(??:?? ??)
77CB57C2 ntdll!RtlLargeIntegerDivide()(C:\ Windows \ system32 \ ntdll.dll:??)
003E1030 ?? ()(??:?? ??)
77C92A8A ntdll!RtlCopyExtendedContext()(C:\ Windows \ system32 \ ntdll.dll:??)
?? ?? ()(??:?? ??)
T是短字节,顺便说一句。
答案 0 :(得分:8)
你的指针算术错了。让我们说:
T* p = new T[10];
要获得第n个元素,您必须使用
T* nth = p + n;
在你的memcpy参数中,你可以像
一样使用它T* nth = p + sizeof(T) * n;
这显然有时会超出范围。
答案 1 :(得分:3)
在memcpy中你正在使用Data + Offset * TSize,当你说一个int实际需要4个字节的数据+ 1时,这是不正确的,所以你不必在指针的情况下指定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更好地解释