2010/05/26 (水) 00:43:00        [qwerty]
void functionD() // 3つの資源を同時に使う
{
    FILE_HANDLE fh = OpenFile("some-file");
 
    if (fh != INVALID_HANDLE) {
        stlsoft::scoped_handle<FILE_HANDLE> cleanup(log, CloseFile, INVALID_HANDLE); // ファイルハンドルを「安全」にする
 
        SOCKET_HANDLE sk = OpenSocket("service-host");
 
        if (sk != INVALID_SOCKET_HANDLE) {
            stlsoft::scoped_handle<SOCKET_HANDLE> cleanup2(sk, CloseSocket, INVALID_SOCKET_HANDLE); // ソケットを「安全」にする
 
            void *mem = malloc(10000);
 
            if(NULL != mem) {
                stlsoft::scoped_handle<void*> cleanup3(mem, free); // メモリが確実に解放されるようにする
 
                // ここでメモリとソケットとファイルハンドルを使う。
 
            } // 'mem'はここで解放される。
 
            // ソケットを自動的な管理から切り離す。
            SOCKET_HANDLE sk2 = cleanup2.detach();
 
        } // 'sk'はcleanup2から切り離されたので、ここでは閉じられない。
 
        cleanup.close(); // 早期に'fh'の資源を返却する。
 
    } // 'fh'の資源は既に返却されているので、ここでは返却されない。
}