2016-07-05 32 views
-1

の配列、および配列の配列:私は配列で働いている複雑な配列

typedef std::valarray<Complex> CArray; 

CArray ca; 

CArray x[16]; 

がやっています:

x[0] = ca; 

は、ハードコピーを行うか、単に参照しますか?

これを作る方法は、後で既存の配列に割り当てられる16個のポインタのリストにすぎませんか?ハードコピーを避ける方法

私はこれについてはよく分からない:

CArray *x[16]; 
x[0] = *ca; 
+0

ハードコピー...ちょうどよくこれをデバッガで実行し、自分自身で見ることができます。 –

+0

Ok @barakmanos。ハードコピーを避けるには? – Basj

+0

あなたが言ったように:ポインタを作ってください。 –

答えて

1

あなたが正しい、x[0] = caは明らかにあなたが望むものではありませんコピー割り当てを実行します。

あなたは、ポインタの例では近いですが、あなたの代わりにアドレスcaの取得する必要があります:あなたはそれが消え適切にないようcaの寿命を管理するのは非常に慎重でなければならない、しかし

CArray *x[16]; 
x[0] = &ca; 

スコープの時期尚早。

スマートポインタを使用して調べることができます。

は編集:「他の回答

上のあなたのコメントを考えると何の言及はそれのためにもはや存在しなくなるまでの配列が存在することになりシステムがないです(私はから来ています?これはガベージコレクタのPython、「

私は前に述べたようにはい、あなたはスマートポインタを使用したい場合がありxは唯一の所有者になる場合は、std::unique_ptrで始めることができる:!。

std::unique_ptr<CArray> x[16]; 

参照されなくなったスコープから外れる16個の一意なポインタの配列を作成します。ここでは、割り当てることができます方法は次のとおりです。

x[0] = std::make_unique<CArray>(); 

あなたは他のオブジェクトがメモリの寿命に参加したい場合(つまり、複数の人がそれを参照して終了するまで、メモリが割り当て解除されることはありません)、プロセスが非常にありますshared_ptrを使用して同じ:それらは容易にコピーされているので

std::shared_ptr<CArray> x[16]; 
x[0] = std::make_shared<CArray>(); 

共有ポインタがで動作するように簡単ですが、あなたは時間と空間のオーバーヘッドコストの少しを支払います。心に留めておくべき二つのものがあります

x[0] = &ca; 

:、あなたが実際に&演算子を使用し、値または参照型から割り当てるには

CArray *x[16]; 

を使用すべきポインタの配列を作成するには

2

  • CArray caは自動オブジェクトなので、それは変数のスコープに制限されています。
  • 配列xはどの値でも初期化されていません。ヌルポインターがある場合は、自分で初期化する必要があります。
+0

システムはありませんか?それは配列がもう存在しなくなるまで存在するでしょう? (私はガベージコレクタであるPythonから来ています!) – Basj

+0

std :: shared_pointersを見たいかもしれません。ここには[クイックリファレンス](http://en.cppreference.com/w/cpp/memory/shared_ptr) – rtmh

+1

C++にはガベージコレクタ自体はありません。最初に[Dynamic memory](http://www.cplusplus.com/doc/tutorial/dynamic/)を見てからshared_ptrを続けることをお勧めします。 – majk

関連する問題