自定义类型在使用容器存副本时需要注意重载赋值和拷贝构造函数

1、如果用容器存副本,则容器销毁的时候,副本也会自动被删除。如果用容器存指针,则容器销毁的时候,不会删除这些指针所指向的对象,因此必须先手工删除完毕之后,再销毁容器。
2、如果用容器存副本,其存入、取出的过程是通过拷贝构造函数和赋值操作符来进行的。如果你没有显式地提供这两者,则使用缺省的拷贝构造函数和赋值操作符,其实现方式为:内存复制。例如:假若你没有提供CFileAttribute::operator=,那么语句fileAttribute1 = fileAttribute2就相当于:memcpy(&fileAttribute1, &fileAttribute2, sizeof(CFileAttribute))。如果你的CFileAttribute仅包含简单变量,例如:
class CFileAttribute
{
  int i;
  double d;
};
那么memcpy没什么不妥。但假若你的自定义类中包含(或者嵌套包含)指针,那么就可能有问题了,因为指针的复制并不等于内存块的复制,因此你必须显示地提供一个CFileAttribute::operator=,并且在其中把指针所对应的内存块也复制一遍,这才是真正的副本(此时这两个副本内的指针反而是不相等的,因为分别指向不同的内存块),其中任何一个副本的销毁(一般会在析构函数中把其指针所指向的内存块同时销毁)都不会影响到另一个副本的独立存在。
你的CFileAttribute::m_str显然是CString类型,而CString内部当然是一个指针,因此缺省的、memcpy方式的拷贝构造函数以及赋值操作符一定会出问题。你必须显式提供自己的拷贝构造函数以及赋值操作符。

posted @ 2011-07-13 00:56  dzqabc  阅读(583)  评论(0编辑  收藏  举报