2011-07-19 9 views
5

C++ STLでauto_ptrの実装を読んでいます。C++のauto_ptrのポインタ演算

- >と*のようなポインタでよく使われる操作は、同じ意味を保持するようにオーバーロードされています。しかし、ポインター算術は自動ポインターで動作しますか?

私はオートポインターの配列を持っていると私は配列+ 1のような何かをすることができますし、配列の2番目の要素のアドレスを取得することを期待したい。どうすれば入手できますか?

私はこの要件のための実用的なアプリケーションを持っていないだけで好奇心から尋ねます。

+1

あなたがこれまでに試してみましたか?私はあなたが5分を過ごすことができ、テストプログラムを書いて、これを自分自身で把握できると思います。 –

+2

オートポインターの配列、または配列への自動ポインター? –

+0

標準では、同じ配列内を指すポインタ(またはその配列の末尾を指すポインター)間のポインタ演算のみが可能です。したがって、 'auto_ptr'の算術演算は定義によってバグを表します。 @ボーの答えを見てください。 – Nemo

答えて

10

auto_ptrにのみ、単一の要素を指すことができます。

ここでポインタ演算は使用しません。

オブジェクトの配列が必要な場合は、代わりにstd :: vectorを使用することをおすすめします。

+0

我々は、自動ポインタの配列を持つことができますか?概念的には次のようになります:std :: vector > array [10]; auto_ptr onep; onep =配列; onep + 1 - > display()は意味がありますか? – xyz

+0

これはauto_ptrのベクトルの配列です。 'auto_ptr'はコンテナ内では機能しません。 –

+0

あなたが本当に**注意しているのであれば、auto_ptrsの配列を持っていますが、私は見たことがありません。ベクトルがコピーを作成してポインタを失う可能性があるので、それらをベクトルに入れない**ことができます。多くの 'int'sが必要な場合は、単にベクトルを使うことができます。そして、完了したらメモリを解放するような大部分の処理を行います。 –

1

auto_ptrのドキュメントをご覧ください。

auto_ptrのポインタ算術は定義されていません。

auto_ptr<int> p1(new int(1)); 
*p2 = 5; // Ok 
++p2;  // Error, no pointer arithmetic 
1

これは実際には、ポインタ算術演算とは何の関係もありません。それは、そのポインタを削除するdelete(としないdelete[])を使用するため

// applies as well with soon-to-be-deprecated std::auto_ptr 
typedef std::unique_ptr<T> smart_ptr; 

smart_ptr array[42]; 

// access second element 
array[1]; 
// take address of second pointer 
&array[1]; 
// take address of second pointee 
array[1].get(); 
1

オブジェクトの配列を下に進めると、同じように動作します。ここexampleです:

#include <memory> 
#include <iostream> 

int main() 
{ 
    std::auto_ptr<int> foo[3]; 

    foo[0] = std::auto_ptr<int>(new int(1)); 
    foo[1] = std::auto_ptr<int>(new int(2)); 
    foo[2] = std::auto_ptr<int>(new int(3)); 

    std::auto_ptr<int> *p = &foo[0]; 

    std::cout << **p << std::endl; 
    std::cout << **(p + 1) << std::endl; 
} 

出力:

1 
2 
+0

ここでpは普通のポインタで、算術演算+演算を知っています。私はstdのようなsthを行うことができますかと思う(としようとしている):: auto_ptr p;次にp + 1等。そして、それは意味をなさない。 – xyz

+1

'std :: auto_ptr p'は 'p'が単一の整数へのポインタであることを意味する。では、 'p + 1'はどうしてこの場合意味がありますか?また、 "sth"とは何ですか? – Praetorian

+0

sth =何か。おそらく一般的に使用されていませんはいp + 1はこれで意味をなさないでしょう。私は自動ポインタの配列を持っているし、配列のベースを指す自動ポインタ上の算術演算を行うしようとしています。誰かが言ったように、自動ポインタのstl defnはそのような算術演算子を許可しません。たぶんそれは意味を持たず、事を複雑にするだけかもしれないからです。 – xyz

関連する問題