此函数应从文件中读取字符串并将其返回,但在调用ReadFile程序后立即在第985行的debug_heap.cpp文件中命中断点。
char* readFile()
{
char curDirectory[MAX_PATH];
GetCurrentDirectory(MAX_PATH, curDirectory);
char filePath[MAX_PATH];
char *name = "\\data.txt";
sprintf_s(filePath, "%s%s", curDirectory, name);
HANDLE hFile = CreateFile(filePath, GENERIC_ALL, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
DisplayError("Can't Create File");
return NULL;
}
DWORD fileSize = GetFileSize(hFile, NULL);
char *buffer = new char[fileSize / 2 + 1];
DWORD bytesReaded;
if (ReadFile(hFile, buffer, fileSize, &bytesReaded, NULL) == 0)
{
DisplayError("Can't read File");
return NULL;
}
buffer[bytesReaded] = '\0';
CloseHandle(hFile);
return buffer;
}
答案 0 :(得分:2)
这是因为您的代码写入超出缓冲区的末尾。您可以像这样分配buffer
:
char *buffer = new char[fileSize / 2 + 1];
但是您尝试从文件中读取fileSize
个字节。您的分配应该是:
char *buffer = new char[fileSize + 1];
其他一些评论:
sprintf_s
的调用可能会导致缓冲区溢出。 std::string
并让该类管理缓冲区。您应该为filePath
和buffer
执行此操作。这样可以避免当前代码泄漏。例如,ReadFile
泄漏内存后失败返回。并且它避免了对调用代码的负担来释放内存。ReadFile
之后返回失败,您也会泄漏文件句柄。bytesReaded
应命名为bytesRead
,以使用正确的英语单词。