ㄱ.   new로 생성한 것은 객체에 대해서는 유효 범위를 벗어 나면 스스로 지워 지는 것이 아니라, 직접 delete를 해 주어야 한다.
- for
문을 사용 하여 delete 해 줄 시

    for_each 만큼 명확하지 않다.

    예외 안전성이 갖추고 있지 않다.
-
포인터 컨테이너 대신에 스마트 포인터의 컨테이너를 사용하는 것
.
-
스마트 포인터 사용시 auto_ptr은 피해야 함
.
- boost
라이브러리에 있는 shared_ptr을 사용.


class Widget
{

};

typedef std::vector< Widget* > VecWidget;

/// for문을 사용한 해제.
void doSomething()
{
	VecWidget widget;

	for( VecWidget::iterator it = widget.begin(); it != widget.end(); ++it)
	{
		delete (*it);
	}
}
/// for_each문을 사용한 해제 - 1.
template<typename t="">
struct DeleteObject
	: public unary_function<const t*,="" void="">
{
	void operator() (const T* ptr) const
	{
		delete ptr;
	}
};
void doSomething()
{
	VecWidget widget;

	/// Widget의 포인터를 삭제 하는 것이 당연하지만, 실수로 Widget 외의
	/// 것을 할 경우 버그를 발생할 우려가 있음.
	for_each(widget.begin(), widget.end(), DeleteObject<widget>())
}

/// for_each문을 사용한 해제 - 2.
struct DeleteObject
{
	template<typename t="">
	void operator() (const T* ptr) const
	{
		delete ptr;
	}
};
void doSomething()
{
	VecWidget widget;

	/// Widget의 포인터를 삭제 하는 것이 당연하지만, 실수로 Widget 외의
	/// 것을 할 경우 버그를 발생할 우려가 있음.
	for_each(widget.begin(), widget.end(), DeleteObject())
}
</typename></widget></const></typename>

Posted by 냉동