【问题标题】:C++ malloc/memcpy/free crashC++ malloc/memcpy/free 崩溃
【发布时间】: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


【解决方案1】:

你弄错了指针算法。比方说:

T* p = new T[10];

要到达第 n 个元素,您必须使用

T* nth = p + n;

在你的 memcpy 参数中你可以像这样使用它

T* nth = p + sizeof(T) * n;

这显然有时会超出范围。

【讨论】:

  • 但他也可以将数据和移位器指针转换为 void*,因为 malloc 和 memcpy 在其原型中使用 void*。表达力不如 C++,但...
  • @alexbuisson 不是作废,而是一些字节大小的类型,是的。 void* 不允许指针算术。
【解决方案2】:

在 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 解释得更好

【讨论】:

    猜你喜欢
    • 2015-05-28
    • 2012-01-07
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多