std::vector调用erase函数的问题
今天用 VS2012 (vc11)调试的时候发现了一个惊人的大问题,就是 vector 对象中的元素如果是用户类型(即 class),对容器调用 erase 是非常危险的!因为按照 vc11 的源码,erase 的时候是把后面元素的内容整体向前移动(纯一大段内存拷贝,而不是对象逐个析构和拷贝构造),再销毁尾部的元素。也就意味着,被删除的元素根本就没有机会执行析构函数,内容就被覆写了。如果对象内部有指针(二级),直接被覆盖可能导致严重后果(例如内存泄漏,或者 vector 析构时运行时崩溃)。这种危险只针对容器元素是用户类型的情况,对于内置基本数据类型(char,int,等),包括指针类型,则调用 erase 是不会有上述危险的。
那么保存用户自定义对象(含有指针成员)的vector的erase该怎么实现呢?