オブジェクトの配列を動的に割り当てる
動的に割り当てられた配列を含むオブジェクトを操作する場合、これらのオブジェクトの配列全体を作成すると課題が生じる可能性があります。
A* arrayOfAs = new A[5]; for (int i = 0; i < 5; ++i) { arrayOfAs[i] = A(3); }
のような単純なアプローチを使用すると、ループ内で破棄された A オブジェクトが内部の myArray 配列を削除し、arrayOfAs の配列要素が無効になるため、メモリの問題が発生します。
これらを回避するにはこの問題では、「4 のルール」(または C 11 の拡張された「5 のルール」) を理解することが、生のデータを含むクラスにとって重要です。ポインター:
定義されていない場合、コンパイラーはこれらのメソッドの独自のバージョンを生成しますが、生のポインターには適していない可能性があります。
前述のエラーを解決するには、配列へのポインタを含むクラスには次のものが含まれます:
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 サイトの他の関連記事を参照してください。