エラーメッセージは次のとおりです。「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:このコードが機能してファイルに書き込むことについては触れませんでした。メモリエラーは最後にトリガーされます。