SORU
15 NİSAN 2009, ÇARŞAMBA


C referans bir değişken döndüren bir uygulamadır, kötü mü?

Bu bence biraz özneldir; eğer bu görüş oybirliğiyle (başvurular burada döndürülen kod parçacıkları çok gördüm) olacak mı emin değilim.

this question I just asked, regarding initializing references, referans kötü çünkü, anladığım kadarıyla [] olabilir döndükten doğru bir yoruma göre bellek sızıntıları yol açabilir daha kolay siliniyor bayan için yapar.

Örnekler hayal gördüğümü sürece) takip ve adil bir kaç yerde benim yaptığım gibi bu beni endişelendiriyor,... yanlış anladım? Şeytan mı? Eğer öyleyse, ne kadar kötü?

Ben hissediyorum çünkü benim karışık çanta işaretçiler ve başvurular, birlikte olması, ben yeni C ve toplam karmaşa, ne için kullandığınızda, benim uygulamalar olmalı bellek sızıntısı cehennem...

Ayrıca, akıllı/paylaşılan işaretçileri kullanarak genellikle en iyi yol olarak bellek sızıntıları önlemek için kabul ettiğini anlıyorum.

CEVAP
15 NİSAN 2009, ÇARŞAMBA


Yani:

int& getInt(void)
{
    int i;
    return i;
}

Bu kötü her türlü. Bu yığın ayırmabengidecek ve hiçbir şey başvuruyorsunuz. Bu yarı şeytan:

int& getInt(void)
{
    int *i = new int;
    return *i;
}

Şimdi istemci sonunda garip çünkü:

int& myInt = getInt(); // note the &.
int badInt = getInt(); // the & will be easy to miss (source of problems).
delete &myInt; // must delete.
delete &badInt; // won't work. badInt was a copy of the allocated int, which
                // is now lost forever

Bunun gibi bir işi yapmanın en iyi yolu bence

int *getInt(void)
{
    return new int;
}

Ve şimdi istemci bir işaretçi saklar

int *myInt = getInt(); // has to be a pointer
int& weirdInt = *getInt(); // but this works too if you really want.
delete myInt; // being a pointer, this is easy to do.
delete &weirdInt; // works.

Şimdi operatör zincirleme << print () gibi sınıfları için & güçlüdür, veya operator[].

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Christian Atlas

    Christian At

    26 Mart 2009
  • Friday NightFort

    Friday Night

    15 EYLÜL 2011
  • Lupe Fiasco

    Lupe Fiasco

    23 ŞUBAT 2006