新/删除导致访问冲突

Posted

技术标签:

【中文标题】新/删除导致访问冲突【英文标题】:new/delete causes access violation 【发布时间】: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_ptrvector (1) 删除null就好了,什么都不做,不用检查。 (2) 使用std::vector<BYTE> 您很可能在... 部分的某处更改了lpBuffer 的内容。 如果是定义的,可以使用编译时数组 【参考方案1】:

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

想到两种可能性:

    错误实际上不在delete 中,而是在两侧的代码中。

    您已通过使用覆盖某些随机内存的无效指针或多次删除指针来破坏堆。

在显示的代码中切换到 RAII(即vector)不会发现这些问题,但如果您在其余代码中始终如一地使用它们,可能会有所改善。

【讨论】:

【参考方案2】:

鉴于发布的代码,我不确定为什么会在此处导致访问冲突。

由于缓冲区仅在本地引用,您能否将其设为堆栈变量而不是动态分配?

如果它必须是一个指针,也许你可以使用 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 容器。

【讨论】:

以上是关于新/删除导致访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中删除多维结构会导致访问冲突

MFC 功能区:CView::OnUpdate 中的 RemoveAllSubItems() 导致访问冲突 (VS2008)

DLL代理调用LoadLibrary导致异常:访问冲突读取位置0x00000250

当我尝试删除数组时,C++ 访问冲突读取位置 0xDDDDDDCD 已更新

为啥 *(int*)0=0 不会导致访问冲突?

冲突的版本保留设置导致删除?