boostライブラリの動作(5)ドメインスマートポインタscoped_ptrの4

1431 ワード

第2のケースは,主に異常放出関数を呼び出す場所に用いられる.次の例を示します.
//       ,        。
//      :      2013-02-03
void ThrowFun(void)
{
	if (1)
	{
		throw "Test Throw!";
	}	
}

void TestCallThrow(void)
{
	std::auto_ptr< int > nVal(new int);

	ThrowFun();//      ,         。

	*nVal = 1000;
}

この例では、関数TestCallThrowが異常放出関数ThrowFunを呼び出す場合、スマートポインタを使用しないと面倒になるので、まずこの異常出力をキャプチャし、異常にメモリを削除する操作を追加する必要があります.呼び出し関数が多く、階層が多い場合は、より多くのスナップ異常が必要になり、コードも理解しにくくなり、エラーが発生しやすくなります.
異常処理では、スマートポインタは資源を安全に解放する手段として、このような手段を採用してこそ、より明確で信頼性が高い.
 
もちろんスマートポインタstd::auto_ptrにも注意すべき点があります.
第一に、2つのstd::auto_を同時に譲れないptrポインタは同じオブジェクトを指し、2つのstd::auto_ptrポインタが割り当てられると、所有権は別のポインタに向けられます.
void TestAssign(void)
{
	std::auto_ptr< int > nVal(new int);
	std::auto_ptr< int > pVal = nVal;
	*pVal = 100;
}

この関数ではnValポインタが空になり、メモリポインタをpValポインタに向けます.これがいわゆる制御権移転の特性である.
第二、std::auto_ptrスマートポインタは、一般ポインタか、配列ポインタかを区別できないため、配列ポインタでは使用できません.
第三、std::auto_ptrスマートポインタはコンテナオブジェクトを使用できません.コンテナオブジェクトの割り当てやコピーの動作により、ポインタが失われます.第四、std::auto_ptrスマートポインタは単純なスマートポインタにすぎず,不適切な場合が多い.そのため、boostライブラリのscoped_のようなより複雑なスマートポインタを導入する必要があります.ptr、scoped_array、shared_ptr、shared_array、intrusive_ptr、weak_ptrなどのポインタ.boostライブラリのこれらのポインタは、すべての面に対して特定のソリューションであり、すべての場所で統一的に使用できるわけではありません.これらのスマートポインタの使用を熟知するには、時間をかけて勉強し、より多くの例を練習する必要があります.異なる状況で、より適切なソリューションを選択し、より多くのエラーを防ぐことができます.