C++:

2017-05-11 14 views
9

işlevi için unique_ptr :: get() işlevi gibi bir argümanı iletmek güvenli midir? getAName(getA().get()) gibi bir işlev parametresini geçmek güvenli midir? getA() bir nesneyi unique_ptr<A> döndür.C++:

Aşağıdaki kodun tamamını VS 2010'da test ediyorum, işe yarıyor. Ama C++ standart olup olmadığından emin olmak isterim, diğer C++ derleyicileri ile güvenli mi? konsolda

#include "stdafx.h" 
#include <memory> 
#include <iostream> 

using namespace std; 

class A 
{ 
public: 
    A(){ cout<<"A()"<<endl;} 
    ~A(){ cout<<"~A()"<<endl;} 

    string name() { return "A"; } 
}; 

std::unique_ptr<A> getA() 
{ 
    return std::unique_ptr<A>(new A());; 
} 

void getAName(A* a) 
{ 
    if(a) 
    { 
     cout << a->name().c_str() << endl; 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    getAName(getA().get()); 
    return 0; 
} 

çıkışları şunlardır:

A() 
A 
~() 

tüm derleyiciler için aşağıda güvenli kodunu yapmak gerekli mi?

unique_ptr<A> a = getA(); 
getAName(a.get()); 
+1

c_str() gerekli değil – Kapil

cevap

7

Bu güvenlidir. getA(), getAName() numaralı çağrıyı içeren tüm ifade tamamlandıktan sonra imha edilecek temporary değerini döndürür. Yani getAName() gövdesinin içinde işaretçi geçer geçerli kalır.

Hepsi geçici objeler ... (lexically) oluşturuldukları noktasını içerdiğini tam ifadesini değerlendirirken son adım olarak tahrip

Not olduğu ibre geçtiyseniz o vardır bir yerde (örneğin bir global değişken) saklanır ve daha sonra kullanılır (yani getAName()'un çağrılmasından sonra), işaretçi tarafından işaret edilen nesne geçici olarak std::unique_ptr tarafından yok edilir ve işaretçi sallanır; Daha sonra bunun üzerine ilgisi UB olacaktır. Durum buysa, gösterdiğiniz gibi bunun için adlandırılmış bir değişkene ihtiyacınız olabilir.

+0

Btw kullanıyorsunuz UB ne anlama geliyor? – Kapil

+0

@Kapil [Tanımsız davranış] (https://en.wikipedia.org/wiki/Undefined_behavior). – songyuanyao

+0

Bu bölüm Segmentasyon hatası değil mi (SIGSEV) – Kapil