15

クラスポインタ型の配列を使用するものを使用auto_ptr<>しているので、それに値を割り当てるにはどうすればよいですか。

例えば auto_ptr<class*> arr[10];

arr配列に値を代入するにはどうすればよいですか?

4

4 に答える 4

17

auto_ptrは、ではなくを呼び出すため、配列で使用することはできませdelete pdelete [] p

boost::scoped_arrayまたはその他のboost::smart_array:)が必要です

于 2011-06-29T12:48:00.163 に答える
3

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; }
于 2011-06-29T14:40:09.390 に答える
1

誰もがここで言ったように、配列と auto_ptr を混在させないでください。これは、メモリを解放するのが本当に難しいと感じる複数のリターンがある場合、または別の場所から割り当てられたポインターを取得し、関数を存在させる前にそれをクリーンアップする責任がある場合にのみ使用する必要があります。

もう 1 つのことは、auto_ptr のデストラクタで、格納されたポインタを使用して削除演算子を呼び出すことです。今渡しているのは、配列の単一の要素です。メモリ マネージャーは、渡されたアドレスから割り当てられたメモリ ブロックを見つけて解放しようとします。おそらく、これはすべての割り当てが維持されている既存のヒープではない可能性があります。この操作により、クラッシュ、メモリ破損などの未定義の動作が発生する場合があります。

于 2011-06-29T13:45:39.300 に答える
1

Arrays and auto_ptr<> don't mix.

From the GotW site:

Every delete must match the form of its new. 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:

  1. 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.

  2. Use the Adapter Pattern. Easy to implement, hard to use, maintain, understand. Takes more time / overhead.
  3. Replace auto_ptr With Hand-Coded EH Logic. Easy to use, no significant space/time/overhead. Hard to implement, read, brittle.
  4. Use a vector<> Instead Of an Array. Easy to implement, easy to read, less brittle, no significant space, time, overhead. Syntactic changes needed and sometimes usability changes.

So the bottom line is to use a vector<> instead of C-style arrays.

于 2011-06-29T13:00:20.290 に答える