【发布时间】:2014-01-01 05:06:28
【问题描述】:
我真的被这个 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 是短字节,顺便说一句。
【问题讨论】:
-
如果是C++,那么不要使用malloc/free,使用new/delete
-
使用
rotate可能更安全。 -
你能举一个你怎么称呼它的例子吗?
-
这段代码是邪恶的,但如果你一次注释掉一个 memcpys,你可能会发现是什么导致了问题
-
那个
reinterpret_cast也是错的(应该是static_cast)
标签: c++ templates malloc free memcpy