クラスポインタ型の配列を使用するものを使用auto_ptr<>
しているので、それに値を割り当てるにはどうすればよいですか。
例えば
auto_ptr<class*> arr[10];
arr
配列に値を代入するにはどうすればよいですか?
auto_ptrは、ではなくを呼び出すため、配列で使用することはできませdelete p
んdelete [] p
。
boost::scoped_arrayまたはその他のboost::smart_array:)が必要です
C ++ 0x(MSVC10、GCC> = 4.3など)を使用している場合は、ベースオブジェクトタイプとしてastd::vector<T>
またはaを使用することを強くお勧めしstd::array<T, n>
ます(サイズが固定か可変かによって異なります)。これを割り当てる場合ヒープ上の男とそれを渡す必要があります、それを入れてstd::shared_ptr
ください:
typedef std::array<T, n> mybox_t;
typedef std::shared_ptr<mybox_t> mybox_p;
mybox_p makeBox() { auto bp = std::make_shared<mybox_t>(...); ...; return bp; }
誰もがここで言ったように、配列と auto_ptr を混在させないでください。これは、メモリを解放するのが本当に難しいと感じる複数のリターンがある場合、または別の場所から割り当てられたポインターを取得し、関数を存在させる前にそれをクリーンアップする責任がある場合にのみ使用する必要があります。
もう 1 つのことは、auto_ptr のデストラクタで、格納されたポインタを使用して削除演算子を呼び出すことです。今渡しているのは、配列の単一の要素です。メモリ マネージャーは、渡されたアドレスから割り当てられたメモリ ブロックを見つけて解放しようとします。おそらく、これはすべての割り当てが維持されている既存のヒープではない可能性があります。この操作により、クラッシュ、メモリ破損などの未定義の動作が発生する場合があります。
Arrays and auto_ptr<>
don't mix.
From the GotW site:
Every
delete
must match the form of itsnew
. If you use single-object new, you must use single-object delete; if you use the array form of new, you must use the array form of delete. Doing otherwise yields undefined behaviour.
I'm not going to copy the GotW site verbatim; however, I will summarize your options to solve your problem:
Roll your own auto array
1a. Derive from auto_ptr. Few advantages, too difficult.
1b. Clone auto_ptr code. Easy to implement, no significant space/overhead. Hard to maintain.
So the bottom line is to use a vector<>
instead of C-style arrays.