ホームページ >バックエンド開発 >C++ >C のポインタのベクトルによるメモリ リークを回避するには?

C のポインタのベクトルによるメモリ リークを回避するには?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-19 16:31:031015ブラウズ

How to Avoid Memory Leaks with Vectors of Pointers in C  ?

C のポインターのベクトルによるメモリ リークの回避

動的メモリ割り当てを使用する場合、メモリ リークを防ぐことが重要です。一般的なシナリオの 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。