2011-12-01 113 views
0

好吧,這是令我困惑的......下面的代碼是在DLL中,當我的控制檯應用程序調用此代碼時,它突然在delete[] lpBuffer行處發生訪問衝突。我一整天都在使用這些代碼,而且根本沒有改變它。直到現在,它一直工作得很好。新/刪除導致訪問衝突

訪問衝突消息

未處理的0x6948b1a5在rhcopy.exe例外:0000005:訪問衝突讀取位置0x4de1c37f。

庫代碼

#define MAX_PACKET_SIZE 0x3FFF 

DWORD MyClass::GetFile(LPCSTR lpszRemoteFile, LPCSTR lpszLocalFile) 
{ 
    LPBYTE lpBuffer = NULL; 

    // ... 

    lpBuffer = new BYTE[MAX_PACKET_SIZE]; 

    // ... 

    if(NULL != lpBuffer) 
     delete[] lpBuffer; 

    // ... 
} 

難道我做錯了什麼?

在旁註:我一直在考慮將lpBuffer轉換成矢量。意見?

編輯

我要感謝你們的幫助!但顯然......這不是問題所在。問題實際上是在調用GetFile(...)之後發生的調用應用程序中的printf()聲明。我對這種混亂表示抱歉。看起來微軟的調試工具並沒有指向導致錯誤的線路,而是指向執行的最後一行。我已投票結束這個問題。

+0

「...」部分是什麼? –

+1

告訴我們如何使用'lpBuffer',即什麼被'...'隱藏。你的問題幾乎肯定在那裏。 –

+2

是的,只要有可能,用'unique_ptr'和'vector'替換RIAA類的動態內存。 –

回答

4

您在此處顯示的代碼沒有任何錯誤。

兩種可能性浮現在腦海中:

  1. 的錯誤實際上不是在delete但在代碼只是兩邊。

  2. 通過使用無效指針覆蓋一些隨機存儲器或多次刪除指針,您已經做了一些破壞堆的操作。

的這些問題,亦不會切換到RAII中所顯示的代碼捕獲(即vector),但如果你在你的代碼的其餘部分用他們一貫可能改善的事情。

1

我不確定爲什麼在發佈代碼的情況下導致訪問衝突。

由於緩衝區只在本地引用,您可以將其設爲堆棧變量而不是動態分配?

如果它必須是一個指針,也許你可以使用一個升壓智能指針來代替:

#include <boost/scoped_array.hpp> 

#define MAX_PACKET_SIZE 0x3FFF 

DWORD MyClass::GetFile(LPCSTR lpszRemoteFile, LPCSTR lpszLocalFile) 
{ 

    boost::scoped_array<BYTE> bufferPtr; 
    ... 
    bufferPtr = boost::scoped_array<BYTE>(new BYTE[MAX_PACKET_SIZE]); 
    ... 
    //No delete needed 

} 

在矢量點,如果它很容易與向量工作,我會選擇它或任何其他STL儘可能容器。