9

クラスのインスタンスのポインターを作成する必要がありますが、プログラムは、作成するポインターの数をコンパイル時に知りません。削除については、ポインターをベクトルに格納してから、それらを 1 つずつ削除することを検討していました。スマート ポインターを使用すると、よりクリーンな方法になりますか? また、スマート ポインターを使用したくない場合、この vector の使用はクリーンと見なされますか?

最小コード:

#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;
    }
}
4

4 に答える 4

1

あなたのコードは問題ありません。ただし、スマート ポインターを使用することをお勧めします (記述するコードが少なくなり、メモリ バグが発生する可能性がはるかに少なくなります)。

于 2013-04-11T07:13:02.023 に答える
1

スマート ポインターを使用すると、よりクリーンな方法になりますか?

はい。

また、スマート ポインターを使用したくない場合、この vector の使用はクリーンと見なされますか?

宿題でなければ、なぜ誰かが C++ でスマート ポインターを使用したくないのか、私にはわかりませんboost::pointer_containers

于 2013-04-11T07:14:02.037 に答える
1

から派生したクラスを使用しておらずFooFoo構成をコピーするのに比較的安価な場合は、単に を使用してvector<Foo>ください。

コンパイラが移動セマンティクスをサポートしている場合、問題はありません。

于 2013-04-11T07:23:21.313 に答える