2017-07-09 10 views
3

動的メモリ割り当てのない配列を返す方法が見つかりません。配列のサイズを知っているので、私はこの問題を解決するために構造体を使用していないダイナミックメモリ割り当てのないC++の戻り配列?

Device* getConnectedDevices() { 
    // scan for devices. 
    Device *connectedDevices = new Device[deviceCount]; // Dynamically allocate memory for the Devices 
    // Get for each device an ID 
    return connectedDevices; 
} 
void doSomething() { 
    // some code 
    // I need a list with all the connected devices!! 
    Device *connectedDevices; 
    connectedDevices = getConnectedDevices(); 
    // do something with the array 
} 

のdoSomething():動的なメモリ割り当てで
:私は、例を用いて詳細にそれを説明する

動的なメモリ割り当てなし

struct deviceArray { Device* devices; int deviceCount; }; 
私はこれを行うにはどのようには考えています。私は次のことを試しました:

  • 参考までに渡します。問題:スキャンする前に配列のサイズがわからない。
  • ダイナミックメモリ割り当てなしで戻る(ローカル変数)。問題:オブジェクトはもはや存在しません(もちろん)。
+6

手動では何も割り当てないでください。単に 'std :: vector'または同様のクラスを使用してください。 –

+1

ローカルポインタを返すことは、関数の終了時に、そのアドレスが有効でないため、常に災害です。したがって、動的割り当てが必要です – dlmeetei

+1

'std :: vector'は動的メモリ割り当てを使用します。違いは、関数が動的に割り当てられたメモリを明示的に管理する必要がないことです。ベクトルは独自のメモリを管理します。 – Peter

答えて

9

一般に、ダイナミックメモリ割り当てを行わないと実行できません。
その問題(サイズの把握、正しい割り当て解除など)は一般的です。

これらの問題は、container classesdynamic memory management smart pointersを使用してC++で解決されています。

std::vector<Device>を使用してデバイスのリストを表し、動的メモリ管理の詳細と複雑さをユーザーから隠すことが適切な場合があります。

3

あなたは、インスタンスのためにiteratorsをUSNG、多くの異なる方法でデバイスのリストを反復処理することができます

std::vector<Device> getConnectedDevices() 
{ 
    std::vector<Device> devices; 
    // Fill `devices' with devices.push_back() 
    return devices; 
} 

、このためnew何もする必要はありません。

通常、C++ではポインタは必要ありません。参照とSTLコンテナの使い方を知っていれば、1つのポインタなしでも何でもできます。しかし、ポインタを使うのは意味がある場合もあるが、これはそのようなものの1つであるとは思わない。

+0

機能の終了時にアドレスは無効になります – dlmeetei

+2

@dlmeeteiこのコードにはまったく関係のないアドレスはありません。これは、ローカル変数へのポインタを返すときだけです。たとえば、 'return&devices'が問題になります。 –

+0

関数の入力時にローカル変数が存在し、関数の終了時に生命が終了する – dlmeetei

関連する問題