C++の難しいことはよく分からないが、これは便利。リソースを例外安全に開放してくれる。STLSoftはヘッダオンリーなので、面倒なインストールが不要ですぐに使える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
#include <windows.h> #include <stdio.h> #include <stlsoft/smartptr/scoped_handle.hpp> void myHeapFree(void* p) { HeapFree(GetProcessHeap(), 0, p); } int main() { // クリップボード { if(!OpenClipboard(NULL)) return -1; stlsoft::scoped_handle<void> clipboard(CloseClipboard); } // カーネルオブジェクト { HANDLE h = CreateMutex(NULL, FALSE, NULL); if ( h==NULL ) return -1; stlsoft::scoped_handle<HANDLE> ko(h, CloseHandle); if(WAIT_OBJECT_0 != WaitForSingleObject(h, INFINITE)) return -1; stlsoft::scoped_handle<HANDLE> wf(h, ReleaseMutex); } // Win32ヒープ { void* p = HeapAlloc(GetProcessHeap(), 0, 100); if ( p == NULL ) return -1; stlsoft::scoped_handle<void*> ha(p, myHeapFree); } // Win32クリティカルセクション { CRITICAL_SECTION cs; InitializeCriticalSection(&cs); stlsoft::scoped_handle<LPCRITICAL_SECTION> ics(&cs,DeleteCriticalSection); EnterCriticalSection(&cs); stlsoft::scoped_handle<LPCRITICAL_SECTION> lcs(&cs, LeaveCriticalSection); } // Cヒープ { void* mem = malloc(100); if(!mem) return -1; stlsoft::scoped_handle<void*> ma(mem, free); } // Cファイル { FILE* f = fopen("C:\\T\\Test.txt", "w"); if (!f) return -1; stlsoft::scoped_handle<FILE*> fo(f, fclose); } // win32ファイル { HANDLE hFile = CreateFileA("C:\\T\\Test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile==INVALID_HANDLE_VALUE) return -1; stlsoft::scoped_handle<HANDLE> fo(hFile, CloseHandle, INVALID_HANDLE_VALUE); } return 0; } |