C++ malloc/memcpy/free crash

C++ malloc/memcpy/free crash

本文关键字:crash free memcpy C++ malloc      更新时间:2023-10-16

我真的被这个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 更好地解释