我正在使用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进行编译,则可以很好地工作。
答案 0 :(得分:1)
对于空终止符,您需要在缓冲区中额外增加一个字符:new char[strlen(argv[0])+1]