调用ReadFile程序后,在debug_heap.cpp

时间:2017-04-03 14:09:49

标签: c++ winapi

此函数应从文件中读取字符串并将其返回,但在调用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;
}

1 个答案:

答案 0 :(得分:2)

这是因为您的代码写入超出缓冲区的末尾。您可以像这样分配buffer

char *buffer = new char[fileSize / 2 + 1];

但是您尝试从文件中读取fileSize个字节。您的分配应该是:

char *buffer = new char[fileSize + 1];

其他一些评论:

  • 您对sprintf_s的调用可能会导致缓冲区溢出。
  • 由于您使用C ++编写代码,请使用std::string并让该类管理缓冲区。您应该为filePathbuffer执行此操作。这样可以避免当前代码泄漏。例如,ReadFile泄漏内存后失败返回。并且它避免了对调用代码的负担来释放内存。
  • 如果您的代码在ReadFile之后返回失败,您也会泄漏文件句柄。
  • bytesReaded应命名为bytesRead,以使用正确的英语单词。
  • 没有理由相信可执行文件位于当前工作目录中。