C++ malloc/memcpy/free崩溃

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是短字节,顺便说一句.

Tim*_*mbo 8

你的指针算术错了.让我们说:

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)

这显然有时会超出范围.