使用容器时一定要保证容器中的对象是可以复制、独立析构的

使用容器时一定要保证容器中的对象是可以复制、独立析构的。下面通过一个简单的例子来说明:

class A
{
public:
	A(int i = 0):ival(i){}
	int ival;
};

class B
{
public:
	double dval;
	A* pa;
	B():dval()
	{
		pa = new A;
	}
	~B()
	{
		delete pa;
	}

	//复制操作及赋值操作符
	B(const B& rhs)
	{
		pa = new A;
		dval = rhs.dval;
	}
	B& operator=(const B& rhs)
	{
		pa = new A;
		dval = rhs.dval;		
	}
};

int main()
{
	B b1;
	B b2 = b1;
	vector<B> vecb;
	vecb.push_back(b1);
	vecb.push_back(b2);
	return 0;
}

在这个程序中如果注释掉该参数的构造函数和赋值操作符,那么程序会报错,因为如果没有它们,b2 = b1会引起b2和b1中的指针指向同一块内存,当程序结束,vector析构时,会调用B的析构函数来delete这个内存,导致它们被删除两次,所以会发生错误。而重载以后的赋值和复制操作符,采用了深拷贝。避免了这个问题。

不仅仅是在STL库中,在其他库中也要注意这个问题,比如MFC的CArray。

你可能感兴趣的:(使用容器时一定要保证容器中的对象是可以复制、独立析构的)