C++ 新建/删除导致访问冲突

C++ 新建/删除导致访问冲突,c++,visual-c++-2010,C++,Visual C++ 2010,好吧,这让我很困惑。。。下面的代码位于DLL中,当我的控制台应用程序调用此代码时,它突然在delete[]lpBuffer行抛出访问冲突。我一整天都在使用这个代码,根本没有改变它。到目前为止,它一直运作良好 访问冲突消息 #define MAX_PACKET_SIZE 0x3FFF DWORD MyClass::GetFile( LPCSTR lpszRemoteFile, LPCSTR lpszLocalFile ) { LPBYTE lpBuffer = NULL; /

好吧,这让我很困惑。。。下面的代码位于DLL中,当我的控制台应用程序调用此代码时,它突然在
delete[]lpBuffer
行抛出访问冲突。我一整天都在使用这个代码,根本没有改变它。到目前为止,它一直运作良好

访问冲突消息

#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;

    // ...
}
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(…)
之后立即出现。我为这一混乱道歉。微软的调试工具似乎没有指向导致错误的那一行,而是指向执行的最后一行。我已投票结束这一问题

鉴于发布的代码,我不太清楚为什么会导致访问冲突

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

如果必须是指针,您可以使用Boost智能指针:

#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

}
#包括
#定义最大数据包大小0x3FFF
DWORD MyClass::GetFile(LPCSTR lpszRemoteFile,LPCSTR lpszLocalFile)
{
boost::作用域数组缓冲ptr;
...
bufferPtr=boost::作用域_数组(新字节[MAX_PACKET_SIZE]);
...
//不需要删除
}

在向量方面,如果很容易使用向量,我会尽可能选择它或任何其他STL容器

鉴于发布的代码,我不太清楚为什么会导致访问冲突

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

如果必须是指针,您可以使用Boost智能指针:

#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

}
#包括
#定义最大数据包大小0x3FFF
DWORD MyClass::GetFile(LPCSTR lpszRemoteFile,LPCSTR lpszLocalFile)
{
boost::作用域数组缓冲ptr;
...
bufferPtr=boost::作用域_数组(新字节[MAX_PACKET_SIZE]);
...
//不需要删除
}

在向量方面,如果很容易使用向量,我会尽可能选择它或任何其他STL容器

这里显示的代码没有任何错误

我想到了两种可能性:

  • 错误实际上并不在
    删除中,而是在代码的两侧

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


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

    此处显示的代码中没有任何错误

    我想到了两种可能性:

  • 错误实际上并不在
    删除中,而是在代码的两侧

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


  • 在显示的代码中切换到RAII(即,
    向量
    )不会发现这两个问题,但如果在其余代码中始终使用它们,则可能会有所改善。

    向我们展示如何使用
    lpBuffer
    ,即,
    隐藏了什么。
    。你的问题几乎肯定就在那里。是的,只要有可能,就用RIAA类替换动态内存,如
    unique\u ptr
    vector
    (1)删除null是可以的,并且没有任何作用,不需要检查。(2) 使用
    std::vector
    。您很可能在
    ..
    部分的某个地方更改了
    lpBuffer
    的内容。如果是定义,您可以使用编译时数组显示如何使用
    lpBuffer
    ,即
    ..
    隐藏的内容。你的问题几乎肯定就在那里。是的,只要有可能,就用RIAA类替换动态内存,如
    unique\u ptr
    vector
    (1)删除null是可以的,并且没有任何作用,不需要检查。(2) 使用
    std::vector
    。您很可能在
    部分的某个地方更改了
    lpBuffer
    的内容。如果是define,则可以使用编译时数组