0 c++ malloc free templates memcpy
我真的遇到了这个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;
}
}
Run Code Online (Sandbox Code Playgroud)
嗯,失败的是:
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是短字节,顺便说一句.
你的指针算术错了.让我们说:
T* p = new T[10];
Run Code Online (Sandbox Code Playgroud)
要获得第n个元素,你必须使用
T* nth = p + n;
Run Code Online (Sandbox Code Playgroud)
在你的memcpy参数中,你可以使用它
T* nth = p + sizeof(T) * n;
Run Code Online (Sandbox Code Playgroud)
这显然有时会超出范围.