STL container 容易发作的bug

STL中,container和其iterator是正交的,我们操作iterator的时候不知道container。而在具体的程序中,两者却往往有相交性,比如常见的bug就是在itertator的遍历中又修改了container(常见于观察者模式),STL不检查这个,而因为其正交性,这种bug很难发现和定位,又是undefined behavor,往往导致事后错误,更加错的无迹可寻。

简单的,把container和其iterator封装在一起就可以解决(应该说是更早的发现而不是解决)这样的问题。简单举个例

template <typename C>
class LoopSafeContainer
{
	bool	m_in_loop;
	C		m_c;
public:
	LoopSafeContainer(){
		m_in_loop = false;
	}
	void clear(){
		m_c.clear();
	}
	size_t size() const{
		return m_c.size();
	}

	template <typename Item>
	void push_back(Item i)
	{
		assert_exp(!m_in_loop);
		m_c.push_back(i);
	}

	template <typename Item>
	bool remove(Item i)
	{
		assert_exp(!m_in_loop);
		size_t sz = m_c.size();
		m_c.remove(i);
		return sz - 1 == m_c.size();
	}


	template <typename Func>
	void for_all(Func f)
	{
		m_in_loop = true;
		for (auto it = m_c.begin(); it != m_c.end(); ++it)
			f(*it);
		m_in_loop = false;
	}
};

 代码简单不解释了(另:没有auto可能写的苦了)。对于常见的应用来讲,的确无需把iterator暴露出来。

posted on 2011-10-12 15:29  风行水上  阅读(219)  评论(0编辑  收藏  举报