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

时间:2011-07-05 10:18:51

标签: 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); 

    delete[] ptr[0];

    delete[] ptr;

    return;

}

这看起来对我无害,不应该给出错误。但是,在delete[] ptr;点,它会让我违反访问权限。

任何人都可以帮助我。我已经做了足够的打击。

2 个答案:

答案 0 :(得分:1)

错误在于以下几行:

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参数。

答案 1 :(得分:0)

感谢您的帮助!在分配中,我们发现问题是你们中的一些人所指出的。所以,我们应该在分配后检查返回的指针是否正确。当我们复制/等时,它从未被编译过。然而,当解析者试图释放内存时,它会给出访问冲突。

此致

安迪