3

auto_ptr の概念を発見したばかりで、気に入っています! Qt は QList または QVector<(some QObject または QWidget) *> を必要とすることが多いため、auto_ptr を避けるべき具体的な理由はありますか。私が正しければ、これを置き換えることができます:

std::vector<MyClass*> vec;
/* add several elements to the vector and do stuff with them */
for(size_t i=0; i<vec.length(); ++i)
{
    delete vec[i];
}
vec.clear();

はるかに短いものを使用 (つまり、クリーンアップなし)

std::vector<auto_ptr<MyClass>> vec;
/* add several elements to the vector and do stuff with them */
// no need for the delete loop

... Qt は引き続き auto_ptr の共有メモリ マジックを使用できますか? 親子の自動マジック メモリ管理は引き続き透過的に機能しますか? ありがとう

4

3 に答える 3

12

Qtには、多くの点でより優れた独自のスマートポインタークラスがありますstd::auto_ptr。特に、それらの一部は問題なくコンテナーに入れることができます。std::auto_ptr所有権転送コピーセマンティクスがあるため、コンテナに入れようとすると期待どおりに機能しません。

を使用してみてくださいQSharedPointer。これは、参照カウントされたスマートポインターであり、スマートポインターのコピーが残っていない場合に、含まれているオブジェクトを削除します。とは異なりstd::auto_ptr、同じものの複数のコピーが同時に存在する可能性があるQSharedPointerため、コンテナーでうまく機能します。

于 2010-05-21T17:40:19.463 に答える
2

ポインターの所有権を持つコンテナーが必要な場合は、ブースト ポインター コンテナーを参照してください。

コンテナーにポインターを配置しますが、他のコンテナーと同様に、ポインターは通常のオブジェクトのように扱われるため、標準のアルゴリズムで簡単に使用できます (つまり、ラッパー クラスを記述する必要はありません)。ポインター コンテナーがスコープ外になると、コンテナー内のすべてのポインターに対して delete が呼び出されます。

boost::ptr_vector<MyClass>   v;
v.push_back(new MyClass(12));

std::for_each(v.begin(), v.end(), DoStuff());

// Destroyed here.
于 2010-05-21T18:45:03.143 に答える
1

std::auto_ptrはその内容をコピーできることを期待しており、通常の意味で a をコピーすることはできないstd::vectorため、 では使用できません。コピーとは、2 つの同一のものをまとめることを意味し、2 つの同一の があった場合、それらが指していたものは、それらが範囲外になったときに二重に解放されます。(代わりに、コピー元の内部ポインターがゼロになり、コピー先が古いものになっています。)std::vectorstd::auto_ptrstd::auto_ptrauto_ptr

shared_ptr多くの場合 Visual C++ として、boost::shared_ptrまたは Visual C++ 上で利用可能std::tr1::shared_ptrであり、C++0x 標準ライブラリに含まれる を使用するか、Qt が持っているものを使用します。それらはコピーできるため、コンテナーに入れることができます。

于 2010-05-21T17:50:00.080 に答える