C++ 新建/删除导致访问冲突
好吧,这让我很困惑。。。下面的代码位于DLL中,当我的控制台应用程序调用此代码时,它突然在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; /
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,则可以使用编译时数组