好吧,这让我感到困惑......下面的代码在DLL中,当我的控制台应用程序调用此代码时,它突然在行delete[] lpBuffer
处抛出访问冲突。我整天都在使用这段代码而根本没有改变它。到现在为止,它一直很好。
访问违规消息
rhcopy.exe中0x6948b1a5处的未处理异常:0xC0000005:访问冲突读取位置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
转换为向量。意见?
修改
我要感谢你们的帮助!但显然......这不是问题所在。问题实际上是调用应用程序中的printf()
语句,它在调用GetFile(...)
之后发生。我为这种困惑道歉。似乎Microsoft的调试工具没有指向导致错误的行,而是指向执行的最后一行。我投票结束了这个问题。
答案 0 :(得分:4)
您在此处显示的代码没有任何问题。
有两种可能性浮现在脑海中:
错误实际上不在delete
中,而是在任何一方的代码中。
通过使用无效指针覆盖一些随机内存或多次删除指针,你已经做了一些破坏堆的事情。
在显示的代码中切换到RAII(即vector
)时,这些问题都不会被捕获,但如果您在代码的其余部分中一致地使用它们,则可能会改进这些问题。
答案 1 :(得分:1)
我不确定为什么在发布代码时会导致访问冲突。
由于缓冲区仅在本地引用,您可以将其作为堆栈变量而不是动态分配吗?
如果它必须是指针,则可以改为使用Boost Smart Pointer:
#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容器。