【发布时间】:2011-12-01 20:38:14
【问题描述】:
好的,这让我很困惑...下面的代码在一个 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(...) 之后立即发生。我为混乱道歉。微软的调试工具似乎没有指向导致错误的行,而是指向执行的最后一行。我投票结束了这个问题。
【问题讨论】:
-
向我们展示
lpBuffer的使用方式,即...隐藏的内容。你的问题几乎肯定就在那里。 -
是的,尽可能将动态内存替换为 RIAA 类,例如
unique_ptr和vector。 -
(1) 删除null就好了,什么都不做,不用检查。 (2) 使用
std::vector<BYTE>。 -
您很可能在
...部分的某处更改了lpBuffer的内容。 -
如果是定义的,可以使用编译时数组
标签: c++ visual-c++-2010