2016-03-21 21 views
0

Bildiğim kadarıyla auto_ptr, sahiplik aktarimi kavramini çalistirir. Ayrıca, otomatik işaretçi sahipliğini başka bir otomatik işaretçiye aktardığında, artık işaret ettiği nesneyi kullanamaz. Ancak, aşağıdaki programda gösterildiği gibi bu durum böyle değil. Bir şey mi eksik? Lütfen yardım et.Otomatik İşaretçim, sahiplik aktarimindan sonra bile çalisiyor

#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 

Satır L1: Bu nasıl çalışır, p1 artık sahip değil midir?

Satır L2: Bu nasıl çalışır, p1 artık sahip değil midir?

+1

Artık 'auto_ptr' kullanmamalısınız. Şimdi kullanımdan kaldırıldı. Bir ['std :: shared_ptr'] (http://en.cppreference.com/w/cpp/memory/shared_ptr) veya [' std :: unique_ptr'] (http://en.cppreference.com) kullanabilirsiniz./w/cpp/bellek/benzersiz_ptr) – NathanOliver

+0

@NathanOliver Evet. Kabul. Ancak soru hala devam ediyor. Meraktan bahsedebilirsin. Teşekkürler! –

+0

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

cevap

3

Sizin kodunuz ne düşündüğünü göstermiyor.

Bu basit Tanımsız Davranış: Burada auto_pointer sadece kod için azalttığı gerçeği yüzünden kapandığı:

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

yöntemi A::display düşünün - bu yüzden, bu sanal değil aslında basit bir fonksiyonudur adının sınıf kapsamı vardır ve bazı mekanizma aracılığıyla, üzerinde çalıştırıldığı nesneye ilişkin bir örtük this işaretçisini alır.

İşlev adresi, nesne işaretçisine bağlı olmadığı için derlenmiş olduğunuzda, işlevi yalnızca this==nullptr ile başarıyla çağıran kod yayınlanmıştır.

displaythis değerini yazdıran veya işlev içinde A statik olmayan bir veri üyesi kullanacaksanız, bu durum açık olmalıdır. NathanOliver belirttiği gibi


Son olarak, auto_pointer zaten ve iyi bir nedenle kullanımdan kaldırıldı.

İlgili konular