SORU
1 NİSAN 2009, ÇARŞAMBA


Nasıl silmek mi []'bir dizi s biliyor musun?

Tamam, hepimiz aşağıdaki kod ile ne tanımsız, geçirilir, ne bağlı olduğunu kabul düşünüyorum

void deleteForMe(int* pointer)
{
     delete[] pointer;
}

İşaretçiyi farklı şeyler olabilir, ve bu yüzden delete[] koşulsuz gerçekleştirme tanımsızdır. Ama gerçekten dizinin bir işaretçi geçirmeden, biz varsayalım

int main()
{
     int* arr = new int[5];
     deleteForMe(arr);
     return 0;
}

Benim sorum işaretçi, bu durumdabir dizi, bunu bilen kim? Görünüm dil/derleyici açısından, ya da arr bir dizi işaretçisi karşı tek bir int bir işaretçi olup olmadığını hiç bir fikrin yok yani. Heck, hatta arr dinamik olarak oluşturulan olup olmadığını bilmiyor. Eğer takip etmek yerine yaparsam yine

int main()
{
     int* num = new int(2);
     deleteForMe(num);
     return 0;
}

OS Akıllı silmek için sadece bir dizi değil, bir tür 'seri cinayetler' tarafından siliniyor gerisi anısına ötesinde bu nokta (kontrast strlen ve bir sigara-\0-sonlandırılmış dize olur devam et kadar vurur 0).

Kimin işi bu şeyleri hatırlamak mı? İşletim sistemi arka planda kayıt türü geliyor? (Yani, anladım ki başladığım bu yazı diyerek ne olur tanımlanmamış, ama gerçek şu ki, 'katliam' senaryo olmaz, bu yüzden bu pratik dünyabirihatırlamak.)

CEVAP
1 NİSAN 2009, ÇARŞAMBA


Bir soru da verilen cevaplar şu ana kadar yok gibi görünüyor Adres: çalışma zamanı kitaplıkları (OS, gerçekten) kalabilir parça sayısı şeylerde dizi, o zaman neden ihtiyacımız var delete[] sözdizimi var mı? Neden ** 15 tek bir form olarak kullanılır işlemek için kullanılabilir mi?

Bunun cevabı da C 'nin C-uyumlu bir dil olarak kökleri artık çok olmaya çalışır.) gider Stroustrup felsefesi programcı kullanarak olmadıkları tüm özellikler için ödemek zorunda olmamalıdır. Eğer diziler kullanıyorlar eğer değilse, o zaman bellek ayrılan her parça için nesne dizileri maliyeti taşımak zorunda değil.

Eğer sadece kod mu?

Foo* foo = new Foo;

sonra foo için ayrılacak bellek alanı Foo dizileri desteklemek için gerekli herhangi bir ek yük içermemelidir.

Dizi dizi ayırmalarını ekstra boyut bilgileri taşımak için ayarlanmış olduğundan sadece, daha sonra çalışma zamanı nesneleri sildiğinizde bu bilgi aramak için kütüphaneler söylemek lazım. Bunu kullanmak için ihtiyacımız var

delete[] bar;

yerine sadece

delete bar;

bar ise bir dizi için bir işaretçi.

Çoğumuz için (ben de dahil), hafıza fazladan birkaç bayt bu konuda titizlik şirin görünen o ki bugünlerde. Ama hala bir kaç byte (bellek blokları çok yüksek bir sayı olabilir) tasarruf önemli olabilir bazı durumlar vardır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DavidParody

    DavidParody

    17 EKİM 2009
  • hotstrikegently

    hotstrikegen

    26 AĞUSTOS 2011
  • Perihelion

    Perihelion

    23 NİSAN 2008