2016-08-21 4 views
0

をベクトルに生のポインタの内容を移動する、は、私は生のポインタを持っている

char * ptr = (char *) malloc(LIMIT); 
size_t size; 
fill_with_data(ptr, LIMIT, &size); 

今私はstd::vectorを使用してポインタデータをラップしたい、と言います。

auto v = vector<char>(ptr, ptr + size); 

しかし、上記の構文を使用すると、ポインタの内容のコピーが生成されると思います。メモリ内のデータを複製せずに、生ポインタをベクトルに変換する方法はありますか?

+4

_ "生データポインタをベクトルに変換する方法はありますか?" 2番目のテンプレート引数を確認してください)。 –

+0

@πάνταῥεany他の方法をお勧めしますか? –

+0

少しだけ私のコメントを強化しました。 –

答えて

3

¹既存のバッファを使用できません。

既存のバッファのライフタイム管理を自動化する場合は、std::unique_ptrまたはstd::shared_ptrなどのスマートポインタを使用できます。


注:
は、それは非ポータブルな側面に依存しなければならない既存のバッファを使用しますが、そのバッファ内のデータを公開へstd::vectorをだまして、カスタムアロケータを使用することは技術的には可能です¹しましたの実装。

+0

実際に興味深いのは、そのようなカスタムアロケータを書く方法を知ることです。手元にいくつかの例がありますか? –

+0

@πάνταῥεῖ:C++ 11では、allocateとdeallocateを実装しなければなりません(メソッド名を正確に思い出すと)。残りは 'allocator_traits'によって推論され、デフォルトになります。 –

+0

スマートポインタのオプション(特に 'std :: unique_ptr')は、それが真っ直ぐ行く方法でしょう。 –

-1

No.ベクターは容器であり、メモリ内の基本型データとは異なる。基本型データには型キャストを使用できます。ベクタエレメントのメモリアドレスを自分で指定することはできません。

+0

私はあなたができると思います:もしvが型ベクトルなら、あなたは '&v [0]'のような要素を指すことができ、vectorは要素が連続したアドレスを持つことを保証します。 –

2

他の人からも言われているように、他の人が割り当てたメモリをベクターに引き継ぐことはできません。しかし、おそらくあなただけの最初の場所でそれを割り当てるために、ベクターを使用することができます。

std::vector theData(LIMIT); 
size_t size; 
fill_with_data(theData.data(), LIMIT, &size); 
theData.resize(size); 

data()fill_with_dataが、その後に書き込むことができ、その内部の連続したバッファへのアクセスを提供します。次のresize()は、ベクトルがデータの量がsizeしか含まれていないかのように動作します。

+0

はい、そうです。しかし残念ながら、メモリを割り当てる関数は 'C'関数です。それは 'void **'をとり、それが割り当てたデータを指すポインタを与えます。私はzipアーカイブを扱うための 'miniz library' C APIについて話しています。ありがとう、私はあなたの答えを感謝する] –

関連する問題