2016-03-21 15 views
0

私が知る限り、auto_ptrは所有権の移転の概念に基づいて動作します。また、自動ポインタが所有権を別の自動ポインタに転送すると、それがもはや指すオブジェクトを参照することはできません。しかし、これは私が以下のプログラムに示すように見つかったケースではありません。何か不足していますか?助けてください。私の自動ポインタは所有権移譲後も動作します

#include <iostream> 
#include <string> 
#include <memory> 

class A 
{ 
    public: 
    void display(){ 
     std::cout << "Inside class A" << std::endl; 
    } 
}; 

int main() 
{ 
    std::auto_ptr<A> p1(new A()); 
    std::auto_ptr<A> p2; 
    std::cout << p1.get() << std::endl; 
    p2=p1; 

    std::cout << p2.get() << std::endl; 
    p2->display(); 

    std::cout <<p1.get()<< std::endl; //Address of shows 0 as expected 
    p1->display();      //L1 

    std::auto_ptr<A> p3 = p1; //L2 
    std::cout << p3.get() << std::endl; //Address shows 0 as expected 
    p3->display(); 

    return 0; 
} 

Output: 
0x45a0620 
0x45a0620 
Inside class A 
0 
Inside class A 
0 
Inside class A 

ラインL1:p1に所有権がもうないので、これはどのように機能しますか?

L2行:p1に所有権がもうないので、これはどのように機能しますか?

+1

「auto_ptr」はもう使用しないでください。現在は推奨されていません。 ['std :: shared_ptr'](http://en.cppreference.com/w/cpp/memory/shared_ptr)や[' std :: unique_ptr'](http://en.cppreference.com)を使うことができます。/w/cpp/memory/unique_ptr) – NathanOliver

+0

@ NathanOliverはい。合意したしかし、まだ問題は残っています。あなたは好奇心から言うかもしれません。ありがとう! –

+0

関連:http://stackoverflow.com/questions/2474018/when-does-invoking-a-member-function-on-a-null-instance-result-in-undefined-beha – NathanOliver

答えて

3

あなたのコードは、あなたが思う通りに表示されません。

これは簡単未定義の動作です:ここauto_pointerは、あなたのコードはに減少しているという事実をあいまいにされています

A *a {nullptr}; 
a->display(); 

は方法A::display考えてみましょう - それはとても基本的に単純な関数で、仮想ではありませんこのクラスの名前はクラススコープを持ち、暗黙的に呼び出されたオブジェクトへのポインタを暗黙的に受け取ります。

関数のアドレスはオブジェクトポインタに依存しないため、コンパイルされたコードでは、関数を正常に呼び出すコードが生成され、this==nullptrとなります。

displayの値がthisを出力するか、関数内でAの非静的データメンバーを使用する場合、これは明らかです。 NathanOliverが指摘したように


最後に、auto_pointerはとにかく正当な理由のために推奨されていません。

関連する問題