SORU
10 Ocak 2011, PAZARTESİ


C yerel değişkene referans Dönen

Aşağıdaki kod (() func1) return varsa düzeltin? Yerel bir değişken için başvuru dönerken bir sorun olduğunu bir yerde okuduğumu hatırlıyorum. Nasıl func2 farklıdır()?

int& func1()
{
    int i;
    i = 1;
    return i;
}

int* func2()
{
    int* p;
    p = new int;
    *p = 1;
    return p;
}

CEVAP
10 Ocak 2011, PAZARTESİ


Bu kod parçacığı:

int& func1()
{
    int i;
    i = 1;
    return i;
}

bir ömür boyu işlev çağrısı kapsamında sınırlı olan bir nesne için bir takma ad (referans) dönen olduğun için değil çalışacaktır. func1(), int i ölür, referans artık var olmayan bir nesne anlamına gelir, çünkü işlevi değersiz hale gelen geri döndüğünde anlamına gelir.

int main()
{
    int& p = func1();
    /* p is garbage */
}

İkinci versiyonu değişken işlev çağrısı ömür boyu bağlı olmayan serbest Store'da tahsis edildiği için çalışıyor. Ancak, deleteint tahsis ıng sorumludur.

int* func2()
{
    int* p;
    p = new int;
    *p = 1;
    return p;
}

int main()
{
    int* p = func2();
    /* pointee still exists */
    delete p; // get rid of it
}

Genellikle RAII bazı sınıf işaretçiyi sarın ve 15 ** gerek yok yani fabrika bir fonksiyonu Kendin/.

Her iki durumda da, sadece değer dönebilirsiniz kendisi verdiğiniz örnek muhtemelen yapmacık olduğunu farkettim rağmen):

int func3()
{
    return 1;
}

int main()
{
    int v = func3();
    // do whatever you want with the returned value
}

Gayet iyi büyük nesneler func3() Her derleyici günümüzde return value optimization çeşit uygular çünkü ilkel değerler verir aynı şekilde geri dönecek unutmayın:

class big_object 
{ 
public:
    big_object(/* constructor arguments */);
    ~big_object();
    big_object(const big_object& rhs);
    big_object& operator=(const big_object& rhs);
    /* public methods */
private:
    /* data members */
};

big_object func4()
{
    return big_object(/* constructor arguments */);
}

int main()
{
     // no copy is actually made, if your compiler supports RVO
    big_object o = func4();    
}

İlginçtir, bir bağlama, geçiciinşbaşvuru perfectly legal C .

int main()
{
    // This works! The returned temporary will last as long as the reference exists
    const big_object& o = func4();    
    // This does *not* work! It's not legal C   because reference is not const.
    // big_object& o = func4();  
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
C++

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Anthony

    Eric Anthony

    13 AĞUSTOS 2011
  • Lamborghini

    Lamborghini

    13 Aralık 2005
  • PomplamooseMusic

    PomplamooseM

    28 HAZİRAN 2008