C ++ malloc / memcpy / free崩溃

时间:2013-12-13 12:17:47

标签: c++ templates malloc free 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;
        }
    }

嗯,失败的是:

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

2 个答案:

答案 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更好地解释