繁体   English   中英

新/删除导致访问冲突

[英]new/delete causes access violation

好的,这让我感到困惑……下面的代码在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(...)在调用GetFile(...)之后发生。 对此我感到抱歉。 似乎Microsoft的Debugging工具不是指向导致错误的行,而是指向执行的最后一行。 我投票结束了这个问题。

您在此处显示的代码没有错。

我想到了两种可能性:

  1. 该错误实际上不在delete而是在任一侧的代码中。

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

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

我真的不确定给定代码后为什么会导致访问冲突。

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

如果必须是指针,则可以改用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容器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM