2016-06-28 7 views
3

例としてunique_ptrとそのreleaseメソッドを考えてください。は、管理対象オブジェクトへのポインタを返し、所有権を解放します
リリースstd::arrayの基になる配列の所有権はありますか?std :: array <T, N>はデータを公開できますか?


[OK]を、1の代わりにstd::arraystd::unique_ptrを使用することができますし、それがすべてです。とにかく、後者には、時に便利なsizeメンバーメソッドのようないくつかの素晴らしい機能があります。それはスタック上にあり、内容が自動的にスタックからポップされたときに、それはスコープの外に出ない限り、その内容物を放出することはできませんので

+1

'std :: unique_ptr >のようなサウンドはうまくいくでしょう。 'std :: array'はデータがどこにあるかを選択しません。 – chris

+0

@chrisええ、現実世界の問題ではないと考えてください。私はそこでうまくいくことを知っています。私は、これらのデータを公開する方法が存在するかどうかを知りたいと思っていました。私は自分自身が_よく言っていることを発見しました。それは有用であったでしょう。それだけです。 :-) – skypjack

+0

これはより一般的な質問のようです。スコープから外れる前にオブジェクトからメンバーを救うことができますか? – wally

答えて

9

std :: arrayの基本配列の所有権を解放する方法はありますか?

番号std::arrayは、生の配列の単なるラッパーです。それは再割り当てすることができますが、実際は配列内のすべての要素のコピー操作です。宛先配列はソース配列を指しません。

またstd::arraystd::unique_ptr<type[]>std::arrayサイズはstd::unique_ptr<type[]>サイズは、実行時に設定することができ、コンパイル時に知っていなければならないということで異なっていることに注意してください。 std::unique_ptr<type[]>はすべてtype * name = new type[some_size]をラップしています。

+0

'std :: array'の「素晴らしい機能」を維持したい場合は、' std :: unique_ptr バッファ 'と' size_t size'で構成されるラッパークラスを書くのは簡単ですメンバー 'begin'、' end'、 'empty'、' size'、もちろん 'release'です。基本的に明るい 'std :: vector'は動的にサイズ変更されません。 – KABoissonneault

+0

@ KABoissonneaultそれはまだ集約型ですか? – NathanOliver

+0

私はそうではないと思います。ラッパーの 'size'を公開したくないのですが、それは構造上正しいはずです。 – KABoissonneault

4

いやは、std::arrayは、ネイティブ配列の周りだけの単純なラッパーである

あなたに代わりにstd::vectorを使用することを検討する必要があります。すでにヒープ上の配列を扱っているからです。 std::moveベクトルを別のものに入れて、コンテンツの所有権を「移転」することができます。例えば

another_vec = std::move(old_vec); // now another_vec has the contents 

あなたがunique_ptrを使用する場合は、あなたが取得している配列は、ヒープ上ではなくスタックにあります!したがって、代わりにstd::vectorとそのdata()関数を使用する方が良いかもしれません。しかし、あなたのユースケースについては完全にはわかりません。

別のノートではstd::arrayを使用することを考えたときに明らかにされていません型は重量級のオブジェクトがあるということですもう一つは、これはのように簡単ではありませんので、通常の右辺値の最適化として最適に動作しない場合がありますことを意味しvector

+0

しかし、 'std :: vector'は内部データを解放することもできません。 – user2079303

+0

@ user2079303あなたは(少なくとも保証されていない方法で、実装が実際のリリースを最適化することを意味します。これはおそらくあなたが望むものより優れています)。 'std :: vector :: shrink_to_fit'を見てください – Curious

+0

管理対象オブジェクトへのポインタを返して所有権を解放する「*' release'メソッド*」を誤解していると思います。 'shrink_to_fit'はソートの何もしません。 *縮小された配列に再割り当てすると、元のメモリは "解放"されずに破棄され、呼び出し元に返されます。 – user2079303

1

«リリース»std :: arrayは基本的にはデストラクタを呼び出し、メモリを他のものに使うことを意味します。

明示的に構築されたstd ::配列を明示的に破棄するには、標準ライブラリにあるstd :: * destroy関数を使用するか、明示的にデストラクタを呼び出します。

他の選択肢がない非常に基本的なデータ構造を実装していない限り、これは通常避けたいものです。 1つのユースケースは、ポインターによる間接指定を行わずにグローバル配列を構築し、どのようにして破壊するかを制御したい場合です。

C++ 17では、オブジェクトを明示的に破棄するために新しい関数 destroy_at, destroy and destroy_nを提供することがあります。

C++ FAQ on destructorsも参照してください。

関連する問題