動的メモリ割り当てを使用する場合、メモリ リークを防ぐことが重要です。一般的なシナリオの 1 つは、基本クラスから派生したオブジェクトへのポインターのベクトルを使用することです。
std::vector はポインターのメモリを管理しますが、オブジェクトは管理しません彼ら自身。これは、ベクターの Push_back() メソッドを通じて割り当てられたオブジェクトが、ベクターがスコープ外になったときに自動的に削除されないことを意味します。
1.手動オブジェクト削除:
このアプローチでは、以下のコードに示すように、ベクトルがスコープ外になる前に各オブジェクトを手動で削除する必要があります。
#include <vector> struct base { virtual ~base() {} }; struct derived : base {}; typedef std::vector<base*> container; void foo() { container c; for (unsigned i = 0; i < 100; ++i) c.push_back(new derived()); // Manual object deletion for (auto& obj : c) delete obj; }
2.スマート ポインター:
もう 1 つの方法は、自動メモリ管理を提供するスマート ポインターを使用することです。 std::unique_ptr および std::shared_ptr は、一般的に使用されるスマート ポインターです。
std::unique_ptr:
unique_ptr は、リソースの唯一の所有権を表します。スコープ外になると、オブジェクトは自動的に削除されます。
#include <vector> #include <memory> struct base { virtual ~base() {} }; struct derived : base {}; typedef std::vector<std::unique_ptr<base>> container; void foo() { container c; for (unsigned i = 0; i < 100; ++i) c.push_back(std::make_unique<derived>()); }
std::shared_ptr:
shared_ptr を使用すると、複数の所有者がリソースを共有できます。所有者の数を追跡し、参照カウントが 0 に達するとオブジェクトを削除します。
#include <vector> #include <memory> struct base { virtual ~base() {} }; struct derived : base {}; typedef std::vector<std::shared_ptr<base>> container; void foo() { container c; for (unsigned i = 0; i < 100; ++i) c.push_back(std::make_shared<derived>()); }
3. Boost::ptr_container:
Boost::ptr_container::ptr_vector は、ポインタを保持し、破棄時に自動的に削除するように設計された特殊なコンテナです:
#include <boost/ptr_container/ptr_vector.hpp> struct base { virtual ~base() {} }; struct derived : base {}; typedef boost::ptr_vector<base> container; void foo() { container c; for (int i = 0; i < 100; ++i) c.push_back(new Derived()); }
一般的に推奨されることを覚えておいてください自動で例外安全なメモリを提供するスマート ポインター (特に std::unique_ptr) を使用します。 管理。手動によるオブジェクトの削除を避け、メモリ リークやコード内の予期しない動作を防ぐために、必要がなくなったリソースは常に割り当て解除されるようにしてください。
以上がC のポインタのベクトルによるメモリ リークを回避するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。