C++注意的小细节 (二) 不要在vector内部数据上操纵vector

    技术2024-08-02  68

    比如,我有一段代码如下:

     

     

    class cls_vector_item { private: vector<int> data; public: cls_vector_item(int a_data_num):data(a_data_num) { do_something(); } void do_it(vector<cls_vector_item>& vct) { for(int cnt=0;cnt<data.size();cnt++) { cls_vector_item cvi(10); vct.push_back(cvi); } } } int main(int argc,char**argv) { vector<cls_vector_item> vct(100); do_something()... for(int cnt=0;cnt<vct.size();cnt++) { vct[cnt].do_it(&vct); } } 

     

    这段代码,表面生没有什么问题。

     

    当vct.push_back(cvi);时,当vct内部空间不足的时候,将会重新申请一段空间,这个对象就被移走了!

     

    但是,注意,这个对象本来应该移走,但我们现在所在这个对象的内部的这个对象并么有移走,反而会变成垃圾,也就是在vct申请空间时,旧空间被析构,但逻辑上我们的对象仍然是垃圾对象,所以便悲剧了。

     

    所以,以后再使用vct时一定要小心,小心被析构。

     

    解决办法有两种:

    (1)给定vector一定的空间,让其有足够的空间。

    (2)这种设计模式本身就是有问题的,我们可以调整结构,比如在别处写一个函数do_it(int pos,vector<...> vct);

     

    最新回复(0)