C++ 删除动态创建的二维数组时的访问冲突消息
我试图动态分配一个二维数组,然后在使用后将其删除。代码如下所示:C++ 删除动态创建的二维数组时的访问冲突消息,c++,pointers,access-violation,C++,Pointers,Access Violation,我试图动态分配一个二维数组,然后在使用后将其删除。代码如下所示: func(char* pszError) { //Initialize char ** ptr = new char*[1]; // Some copying stuff in ptr[0] ptr[0] = new char[strlen(psError) + 1]; strcpy(ptr[0], strlen(pszError) + 1, pszError); dele
func(char* pszError)
{
//Initialize
char ** ptr = new char*[1];
// Some copying stuff in ptr[0]
ptr[0] = new char[strlen(psError) + 1];
strcpy(ptr[0], strlen(pszError) + 1, pszError);
delete[] ptr[0];
delete[] ptr;
return;
}
这对我来说是无害的,不应该出错。但是,在点delete[]ptr代码>它向我抛出访问冲突
有人能帮我吗。我在这方面已经做得够多了。错误在于以下几行:
ptr[0] = new char[strlen(psError) + 1];
strcpy(ptr[0], strlen(pszError) + 1, pszError);
在我看来,其他一切都是正确的。但是代码甚至不应该编译时出现这些错误。需要考虑的几点:
- strcpy不接受3个参数。这段代码甚至不应该编译。这可能意味着以下情况之一:
- 您输入了一个拼写错误,并打算使用strncpy。如果是这种情况,那么您的第2个和第3个参数是向后的,这将导致访问冲突
- 您已经用自己的函数重载strcpy函数,该函数接受3个参数。如果是这种情况,请张贴代码。不过,使用strncpy可能会更好
- “strlen(psError)”也不应该编译(缺少一个“z”)。我假设您的意思是pszError,但是如果您有一个名为psError的全局变量,那么可能分配了不正确的内存量
- 如果pszError是一个错误的指针,或者可能不是以null结尾的,那么代码显然会崩溃
有关正确的strcpy和strncpy参数,请参阅。错误在于以下几行:
ptr[0] = new char[strlen(psError) + 1];
strcpy(ptr[0], strlen(pszError) + 1, pszError);
在我看来,其他一切都是正确的。但是代码甚至不应该编译时出现这些错误。需要考虑的几点:
- strcpy不接受3个参数。这段代码甚至不应该编译。这可能意味着以下情况之一:
- 您输入了一个拼写错误,并打算使用strncpy。如果是这种情况,那么您的第2个和第3个参数是向后的,这将导致访问冲突
- 您已经用自己的函数重载strcpy函数,该函数接受3个参数。如果是这种情况,请张贴代码。不过,使用strncpy可能会更好
- “strlen(psError)”也不应该编译(缺少一个“z”)。我假设您的意思是pszError,但是如果您有一个名为psError的全局变量,那么可能分配了不正确的内存量
- 如果pszError是一个错误的指针,或者可能不是以null结尾的,那么代码显然会崩溃
有关正确的strcpy和strncpy参数,请参阅。谢谢您的帮助!我们发现问题正如你们中的一些人在分配中指出的那样。因此,我们应该在分配之后检查指针返回是否正确。当我们进行复制/等操作时,它从未进行过压缩。然而,当发行程序试图释放内存时,它给出了访问冲突
问候,
安迪谢谢你的帮助!我们发现问题正如你们中的一些人在分配中指出的那样。因此,我们应该在分配之后检查指针返回是否正确。当我们进行复制/等操作时,它从未进行过压缩。然而,当发行程序试图释放内存时,它给出了访问冲突
问候,
安迪错误在“一些复印材料”中。可能在分配的空间之外写入。向我们展示“复制内容”代码部分,我认为问题就在那里。使用std::vector
或Boost.MultiArray。此代码片段是正确的。“ptr[0]中的某些复制内容”中发生了什么?可能您正在(a)显式更改ptr[0]的值,或者(b)通过意外超出ptr[0][]的范围而隐式更改ptr[0]的值。(这两个数组很可能在堆上彼此“坐”在一起)。ptr[0]=newchar[10];ptr[0]=新字符[strlen(psError)+1]代码>->至少内存泄漏…错误在“某些复制内容”中。可能在分配的空间之外写入。向我们展示“复制内容”代码部分,我认为问题就在那里。使用std::vector
或Boost.MultiArray。此代码片段是正确的。“ptr[0]中的某些复制内容”中发生了什么?可能您正在(a)显式更改ptr[0]的值,或者(b)通过意外超出ptr[0][]的范围而隐式更改ptr[0]的值。(这两个数组很可能在堆上彼此“坐”在一起)。ptr[0]=newchar[10];ptr[0]=新字符[strlen(psError)+1]代码>->至少内存泄漏。。。