Deleting vector of pointers

ぃ、小莉子 提交于 2019-12-23 07:39:38

问题


I need to create pointers of instances of a class, and the program do not know at compilation time how many pointers I will create. For deletion, I was considering storing the pointers in a vector, and then deleting them one by one. Would the use of smart pointers a cleaner way to go ? And if one does not want to use smart pointers, would this use of vector be considered clean ?

Minimum code:

#include <vector>
using namespace std;

class Foo {
public:
    Foo();
};
Foo::Foo(){}
void createFooVector(int nb, std::vector<Foo*> &v){
    for(int i=0;i<nb;i++){
        Foo* f = new Foo();
        v.push_back(f);
    }
}
int main(int argc, char *argv[]){
    std::vector<Foo*> v;
    createFooVector(5,v); 
    while (!v.empty()){
        Foo* f = v.back();
        v.pop_back();
        delete f;
    }
}

回答1:


I would suggest either using a boost::pointer_vector, an std::vector<std::unique_ptr<Foo>>, or roll out your own Foo manager class which holds a vector<Foo*> and takes care of deletions in the constructor (you should see this as the "expert" solution, and only attempt it if you fully understand exception safety). You don't want to be doing the deletion manually, that can easily lead to errors.




回答2:


Your code is fine. However, using smart pointers should be the preferred choice (less code to write and much fewer opportunities for memory bugs).




回答3:


Would the use of smart pointers a cleaner way to go ?

Yes.

And if one does not want to use smart pointers, would this use of vector be considered clean ?

I have no ideas, why someone doesn't want use smart pointers in C++, if it's not homework... But, I think, it's better to use something like boost::pointer_containers in this case.




回答4:


If you're not using classes derived from Foo, and Foo is relatively inexpensive to copy construct, just use vector<Foo>.

If your compiler supports move semantics there shouldn't be an issue.



来源:https://stackoverflow.com/questions/15942706/deleting-vector-of-pointers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!