删除动态创建的二维数组时出现访问冲突消息

Access Violation Message on Deleting Dynamically created two dimensional array

本文关键字:访问冲突 消息 二维数组 动态 创建 删除      更新时间:2023-10-16

我正在尝试动态分配一个二维数组,然后在使用后将其删除

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。如果是这种情况,那么您的第二个和第三个参数是向后的,这将导致访问冲突
    • 您已经用自己的函数重载了strcpy函数,该函数接受3个参数。如果是这种情况,请张贴代码。不过,使用strncpy可能会更好
  • "strlen(psError("也不应该编译(缺少"z"(。我想你指的是pszError,但如果你有一个名为psError的全局变量,那么可能分配了不正确的内存量
  • 如果pszError是一个错误的指针,或者可能不是null终止的,那么代码显然会崩溃

请参阅http://linux.die.net/man/3/strcpy对于正确的strcpy&strncpy参数。

感谢您的帮助!我们发现,正如你们中的一些人所指出的,这个问题在分配中。因此,我们应该在分配后检查返回的指针是否正确。当我们复制的时候,它从来没有压缩过。然而,当发行器试图释放内存时,它发出了访问违规。

问候,

Andy