広義のスマートポインタの活用とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > 広義のスマートポインタの活用の意味・解説 

広義のスマートポインタの活用

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/07/14 06:48 UTC 版)

RAII」の記事における「広義のスマートポインタの活用」の解説

スマートポインタ呼ばれる類のクラス使いRAII任意のリソース管理API適用することも可能である。 なお、この節では広い意味でスマートポインタという言葉使っている。一般的にはメモリ特化したものをスマートポインタと言う例えば、stlsoft::scoped_handleは、(voidを含む)任意の型の解放関数受け付け、また0でない広義の「ヌル」値(無効値)も受け付ける(Windowsのように複数呼出規約用いられる環境では、どんなものでも受け付ける)。 以下はWindows APIファイル入出力関数およびWinsock API関数リソースRAIIラップした例である。CreateFile()関数返す無効値INVALID_HANDLE_VALUEおよびWSASocket()関数返す無効値INVALID_SOCKETは、Windows SDK 8.1ではそれぞれ以下のように定義されている。 #define INVALID_HANDLE_VALUE ((HANDLE)((LONG_PTR)-1)) #define INVALID_SOCKET (SOCKET)(~0) RAIIは特に複数リソース同時に管理する場合効果発揮する少なくともtry-catch節がいくつも現れ混乱する事態からは逃れられる。 #include #include #include #include #include #include #include // 3つの資源同時に使う。void testScopedHandle() { // ファイルを開く。 // CreateFile()失敗した場合 INVALID_HANDLE_VALUE を返す。ただし NULL もまた HANDLE としては一般的に無効値。 HANDLE hFile = ::CreateFileW(L"test.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == NULL || hFile == INVALID_HANDLE_VALUE) { throw std::runtime_error("Failed to create file handle!"); } else { stlsoft::scoped_handle cleanupFile(hFile, ::CloseHandle, INVALID_HANDLE_VALUE); // ファイル確実に閉じられるようにする。 // TCP ソケット作成。 // BSD ソケット API における socket() 関数戻り値int で、異常値負数 (-1) となっており、0 は正常値のひとつ。 // Winsock もそれを踏襲している。 SOCKET socketDesc = ::WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0); if (socketDesc == INVALID_SOCKET) { throw std::runtime_error("Failed to create socket descriptor!"); } else { stlsoft::scoped_handle cleanupSocket(socketDesc, ::closesocket, INVALID_SOCKET); // ソケット確実に閉じられるようにする。 void *mem = std::malloc(10000); if (!mem) { throw std::bad_alloc(); } else { stlsoft::scoped_handle cleanupMem(mem, std::free); // メモリ確実に解放されるようにする。 // ここでメモリソケットファイルを使う。 const LARGE_INTEGER dummy = {}; if (!SetFilePointerEx(cleanupFile.get(), dummy, NULL, FILE_END)) { throw std::runtime_error("Failed to set file pointer to end!"); } const char* text = "Test line.\r\n"; const DWORD numOfBytesToWrite = static_cast(std::strlen(text)); DWORD numOfBytesWritten = 0; if (!::WriteFile(cleanupFile.get(), text, numOfBytesToWrite, &numOfBytesWritten, NULL) || numOfBytesWritten != numOfBytesToWrite) { throw std::runtime_error("Failed to write data on file!"); } // ... } // mem はここで解放されるmem = NULL; // ソケット自動的な管理から切り離す。 //SOCKET detachedVal = cleanupSocket.detach(); //assert(detachedVal == socketDesc); } // socketDesc を RAII から切り離した場合、ここでは閉じられない。 //const int ecode = ::closesocket(socketDesc); socketDesc = INVALID_SOCKET; // 早期に hFile の資源返却するともできる。 //cleanupFile.close(); } // hFile の資源早期返却した場合、ここでは返却されない。 hFile = INVALID_HANDLE_VALUE;}int main() { WSADATA wsaData = {}; const int ecode = ::WSAStartup(MAKEWORD(2, 2), &wsaData); if (ecode == 0) { try { testScopedHandle(); } catch (const std::exception& ex) { std::cout << ex.what() << std::endl; } ::WSACleanup(); }}

※この「広義のスマートポインタの活用」の解説は、「RAII」の解説の一部です。
「広義のスマートポインタの活用」を含む「RAII」の記事については、「RAII」の概要を参照ください。

ウィキペディア小見出し辞書の「広義のスマートポインタの活用」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「広義のスマートポインタの活用」の関連用語

1
8% |||||

広義のスマートポインタの活用のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



広義のスマートポインタの活用のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、WikipediaのRAII (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS