2013-12-13 35 views
0

我'真的堅持這個C++錯誤:C++的malloc/memcpy的/無碰撞

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是短的字節,順便說一句。

+4

解釋,如果是C++,那麼就不要使用malloc /免費,使用新/刪除 – codeling

+1

使用'rotate'可能是更安全的。 – doctorlove

+1

你能舉一個你如何稱呼它的例子嗎? –

回答

8

你的指針算術錯了。比方說:

T* p = new T[10]; 

要到第n個元素,你必須使用

T* nth = p + n; 

在你的memcpy的參數,你使用它像

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

這顯然會出時間的界限。

+0

但他也可以將數據和移位器指針轉換爲void * as malloc和memcpy在其原型中使用void *。表達能力不如C++,但是... – alexbuisson

+1

@alexbuisson不是無效的,而是一些字節大小的類型,是的。 void *不允許指針算術。 – Timbo

+0

哦,謝謝你!!!!!!!! –

3

在memcpy中你正在使用Data + Offset * TSize,當你說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); 
更好

由天寶