new / delete导致访问冲突

时间:2011-12-01 20:38:15

标签: c++ visual-c++-2010

好吧,这让我感到困惑......下面的代码在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的调试工具没有指向导致错误的行,而是指向执行的最后一行。我投票结束了这个问题。

2 个答案:

答案 0 :(得分:4)

您在此处显示的代码没有任何问题。

有两种可能性浮现在脑海中:

  1. 错误实际上不在delete中,而是在任何一方的代码中。

  2. 通过使用无效指针覆盖一些随机内存或多次删除指针,你已经做了一些破坏堆的事情。

  3. 在显示的代码中切换到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容器。