C++RALLメカニズムの詳細
4145 ワード
#include
#include
int main()
{
for (int i = 1; i <= 10000000; i++)
{
int32_t *ptr = new int32_t[3];
ptr[0] = 1;
ptr[1] = 2;
ptr[2] = 3;
//delete ptr; //
}
system("pause");
return 0;
}
プログラムを実行して、リソースマネージャを開けて、こんなに簡単なプログラムが500 MB以上のメモリを占有しているので、このような低級な間違いを犯さないように祈るべきです.3.資源の自動放出を保証する方法はありませんか?Javaのように、C++プログラム猿のメンツを失わない.
このとき,オブジェクトの解析は自動的に完了すると考えられるが,このメカニズムを利用してもよいだろうか.答えははっきりしていますから、いいです.私たちがしなければならないのは、リソースをオブジェクトに管理することです.あるいは、このオブジェクトはリソースのエージェントであり、このオブジェクトが構築されたときにリソースの解放を完了します.そこで、上記の例を次のように変更することができます.
#include
#include
// , , , ;
template<typename T>
class auto_release_ptr
{
public:
auto_release_ptr(T *t) :_t(t){};
~auto_release_ptr()
{
delete _t;
};
T * getPtr()
{
return _t;
}
private:
T *_t;
};
int main()
{
for (int i = 1; i <= 10000000; i++)
{
auto arp = auto_release_ptr(new int32_t[3]);
int32_t *ptr = arp.getPtr();
ptr[0] = 1;
ptr[1] = 2;
ptr[2] = 3;
}
system("pause");
return 0;
}
メモリ消費量は0.5 Mのみ、メモリ消費量は0.5 Mのみ、メモリ消費量は0.5 Mになります.4.素晴らしいですね.newのたびにテンプレートクラスauto_に渡すだけです.release_ptrはメモリの漏洩を防ぐことができます!どうやって実現したのか見てみましょう.
newを使用してメモリを出力すると、テンプレートクラスauto_に転送されます.release_ptrは,そのインスタンスのgetPtr()メソッドによりメモリアドレスを得た.auto_release_ptrには、構築時に初期化が完了し、newから出てきた空間を指すデータメンバーがいます.その解析関数ではdeleteを使用してメモリ空間を解放し、newから出てきたリソースとauto_があります.release_ptrオブジェクトと同じライフサイクルで、管理されるauto_release_ptrオブジェクトのライフサイクルが終了すると解放されます.ptrとauto_release_ptrオブジェクトの定義は1つであるため、それらのライフサイクルは自然に同じであり、ptrが回収された場合でも、その指向するメモリ空間が解放されないことを心配する必要はありません.
もちろん、ここでは簡単に例を挙げてRALLを説明します.RALLメカニズムは,オブジェクトの自動破棄を利用することで,リソースにライフサイクルを持たせ,自動破棄(自動回収)の機能を持つ.