動的確保されたメモリの管理とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > 動的確保されたメモリの管理の意味・解説 

動的確保されたメモリの管理

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

RAII」の記事における「動的確保されたメモリの管理」の解説

単純な例として、関数内で一時的な作業領域として配列動的確保することを考える。単純な方法では、以下のようにnew[]演算子使用するvoid function1A(size_t count) { double* array1 = NULL; double* array2 = NULL; try { // 配列動的に確保するメモリ確保失敗により std::bad_alloc 例外スローされる可能性がある。 array1 = new double[count](); array2 = new double[count](); // 動的に確保した配列をここで作業領域として使用する。 for (size_t i = 0; i < count; ++i) { array1[i] = i * 0.1; array2[i] = i * 0.1; } // ... // 配列を使わなくなったので削除するdelete[] array2; delete[] array1; } catch (...) { // 例外スローされる場合備える。 delete[] array2; delete[] array1; throw; // 例外再送出。 }} これはC言語mallocおよびfree関数による原始的な寿命管理手法に近い。もし動的に確保したメモリ削除する前に関数抜けるとメモリリークしてしまうため、慎重に削除処理をひとつひとつ記述していく必要がある動的にメモリ管理するオブジェクトの数が増えるにつれ、ソースコードメンテナンスコスト増大していく。 一方RAII利用した場合は以下のようになる。 // RAII実現する配列ラッパークラス。template class ArrayWrapper { size_t m_count; T* m_data;public: ArrayWrapper() : m_count(), m_data() {} explicit ArrayWrapper(size_t count) : m_count(count), m_data(new T[count]()) {} ~ArrayWrapper() { delete[] m_data; } size_t count() const { return m_count; } T* data() { return m_data; } const T* data() const { return m_data; } T& operator[](size_t index) { return m_data[index]; } const T& operator[](size_t index) const { return m_data[index]; } // コピー禁止とする。所有権移動サポートしない。private: ArrayWrapper(const ArrayWrapper&); ArrayWrapper& operator=(const ArrayWrapper&);};void function1B(size_t count) { ArrayWrapper array1(count); ArrayWrapper array2(count); // 動的に確保した配列をここで作業領域として使用する。 for (size_t i = 0; i < count; ++i) { array1[i] = i * 0.1; array2[i] = i * 0.1; } // ...} // RAII 変数 array1, array2 の属すブロック抜ける。このとき array2, array1 の各デストラクタが順に呼ばれそれぞれ内部管理する配列メモリ領域自動的に破棄されるBoost C++ライブラリboost::scoped_arrayを使う場合は以下のように書ける。 #include void function1C(size_t count) { boost::scoped_array array1(new double[count]()); boost::scoped_array array2(new double[count]()); for (size_t i = 0; i < count; ++i) { array1[i] = i * 0.1; array2[i] = i * 0.1; }} C++11以降std::unique_ptrを使う場合は以下のように書ける。 #include void function1D(size_t count) { std::unique_ptr array1(new double[count]()); std::unique_ptr array2(new double[count]()); for (size_t i = 0; i < count; ++i) { array1[i] = i * 0.1; array2[i] = i * 0.1; }} RAII使ってメモリ管理する場合明示的な削除処理の記述必要なくなり、コード見通しメンテナンス性向上する関数途中でreturnしたり、例外スローされたりする場合でも、後始末自動的に実行してくれる。また、C++のテンプレート利用することで、任意の型に対すRAII実現するラッパークラスを定義することができる。C++標準テンプレートライブラリ (STL) には、RAII概念をもとに実装された汎用的動的配列のクラステンプレートとして、std::vector用意されている。

※この「動的確保されたメモリの管理」の解説は、「RAII」の解説の一部です。
「動的確保されたメモリの管理」を含む「RAII」の記事については、「RAII」の概要を参照ください。

ウィキペディア小見出し辞書の「動的確保されたメモリの管理」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



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

辞書ショートカット

すべての辞書の索引

「動的確保されたメモリの管理」の関連用語

1
10% |||||

動的確保されたメモリの管理のお隣キーワード
検索ランキング

   

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



動的確保されたメモリの管理のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

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

©2025 GRAS Group, Inc.RSS