ホームページ >バックエンド開発 >C++ >C でオブジェクトの配列を動的に割り当てるときにメモリの問題を回避するにはどうすればよいですか?

C でオブジェクトの配列を動的に割り当てるときにメモリの問題を回避するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-18 06:52:17679ブラウズ

How to Avoid Memory Issues When Dynamically Allocating an Array of Objects in C  ?

オブジェクトの配列を動的に割り当てる

動的に割り当てられた配列を含むオブジェクトを操作する場合、これらのオブジェクトの配列全体を作成すると課題が生じる可能性があります。

A* arrayOfAs = new A[5];
for (int i = 0; i < 5; ++i) {
    arrayOfAs[i] = A(3);
}

のような単純なアプローチを使用すると、ループ内で破棄された A オブジェクトが内部の myArray 配列を削除し、arrayOfAs の配列要素が無効になるため、メモリの問題が発生します。

これらを回避するにはこの問題では、「4 のルール」(または C 11 の拡張された「5 のルール」) を理解することが、生のデータを含むクラスにとって重要です。ポインター:

  1. コンストラクター
  2. デストラクター
  3. コピー コンストラクター
  4. 代入演算子
  5. 移動コンストラクター (C 11)
  6. 移動割り当て (C 11)

定義されていない場合、コンパイラーはこれらのメソッドの独自のバージョンを生成しますが、生のポインターには適していない可能性があります。

前述のエラーを解決するには、配列へのポインタを含むクラスには次のものが含まれます:

class A {
    size_t mSize;
    int* mArray;
public:
    A(size_t s = 0) {mSize=s;mArray = new int[mSize];}
    ~A() {delete [] mArray;}

    A(A const& copy) {
        mSize = copy.mSize;
        mArray = new int[copy.mSize];
        // Handle copying of integers/other members
    }

    A& operator=(A other) {
        std::swap(mArray, other.mArray);
        std::swap(mSize, other.mSize);
        return *this;
    }
};

あるいは、std::vector のような標準コンテナを使用すると、メモリ管理が自動的に処理されるため、プロセスが簡素化されます:

class A {
    std::vector<int> mArray;
public:
    A(){}
    A(size_t s) :mArray(s)  {}
};

以上がC でオブジェクトの配列を動的に割り当てるときにメモリの問題を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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