错误消息是:“0x7c810eac”处的指令引用了“0x00000000”处的内存。内存无法“写入”。
如果我删除析构函数一切都很好。但我不明白这里发生了什么。我在任何地方都读到我应该关闭句柄,但这里的代码不允许我这样做。(是的,我知道我可以手动完成......但这是客户端代码中不必要的行,我认为应该由对象处理。)
#include <windows.h>
#include <iostream>
#include <string>
struct fileHandle {
HANDLE hFile;
fileHandle(std::string path) {
hFile = CreateFile(path.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_ARCHIVE, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
printf("error: INVALID_HANDLE_VALUE");
}
}
~fileHandle() {
CloseHandle(hFile);
}
void save(std::string data) {
if (!WriteFile(hFile, data.c_str(), data.size(), NULL, NULL)) {
printf("WriteFile failed: ", GetLastError());
}
}
};
int main() {
fileHandle my_handle("test_file.txt");
my_handle.save("some text");
}
更新:当文件不存在时会发生这种情况。当文件确实存在程序打印错误时,但这是有意的。我在这里要求仅在创建文件时覆盖这种情况(我知道如何重写句柄创建以覆盖现有文件。)
更新 2:我没有提到此代码有效并写入文件。最后触发内存错误。