2011-12-01 114 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尽可能容器。