删除似乎不错的程序时崩溃[]

时间:2019-05-21 16:07:22

标签: c++ visual-c++ delete-operator

我正在使用Visual C ++ 2017构建OpenGL / GLFW应用程序。但是,我在delete[]语句上遇到崩溃,并显示消息“检测到堆损坏:[...] CRT检测到应用程序在堆缓冲区结束后写入了内存”。在我写的以下函数中:

#include <direct.h>

void setwd(char **argv)
{
    char *buf = new char[strlen(argv[0])];
    strcpy(buf, argv[0]);
    // Handle both possible separators
    char *p = strrchr(buf, '/');
    if(!p)
        p = strrchr(buf, '\\');
    if(p)
    {
        *(p + 1) = '\0';
        _chdir(buf);
    }
    delete[] buf;
}

如果我删除对setwd的呼叫,一切正常。我在调试时确保strlen(argv[0])永远不会为0。

值得注意的是,如果使用MSYS2 / gcc进行编译,则可以很好地工作。

1 个答案:

答案 0 :(得分:1)

对于空终止符,您需要在缓冲区中额外增加一个字符:new char[strlen(argv[0])+1]