SORU
7 HAZİRAN 2015, Pazar


Sarkan işaretçiler karşılaştırmak için yasal mı?

Sarkan işaretçiler karşılaştırmak için yasal mı?

int *p, *q;
{
    int a;
    p = &a;
}
{
    int b;
    q = &b;
}
std::cout << (p == q) << '\n';

Her ikisi de p q zaten yok olan nesneleri işaret edin. Bu yasal mı?

CEVAP
7 HAZİRAN 2015, Pazar


Giriş:İlk sorun, yasal p değerini kullanmak için olup olmadığıdır.

a tahrip edildikten sonra, p edinme olarak bilinirgeçersiz işaretçi değeri. N4430 (N4430 durumu "Not" aşağıda): . bakın tartışma için Alıntı

Depolama bölgesi süresinin sonuna ulaşıldığında, tüm işaretçiler ayırmanın depolama herhangi bir adresi temsil eden değerleri haline gelirgeçersiz işaretçi değerleri.

Geçersiz işaretçi değeri kullanıldığında davranışları da aynı metin görünür neredeyse (ve C 14 [basic.N4430 aynı bölümde yer almaktadır stc.dinamik.kaldırma]/4):

Geçersiz işaretçi değeri Yönlendirme ve kaldırma fonksiyonu için geçersiz bir işaretçi değeri geçen tanımsız davranış var. Geçersiz işaretçi değeri başka bir kullanımı vardıruygulama tanımlı bir davranış.

[Dipnot:Bazı uygulamaları geçersiz işaretçi değeri kopyalama, sistem tarafından oluşturulan bir çalışma zamanı hatasına neden olan tanımlayabilir. — son Dipnot ]

Uygulamanız burada ne olması gerektiğini öğrenmek için belgelerine (C 14) başvurmanız gerekir.

Terimkullanınyukarıdaki tırnak içinde means gerektiren lvalue-rvalue dönüşüm, C 14 olarak [dönş./2 lval]:

Lvalue-rvalue bir dönüşüm ifade e uygulandığında, ve [...] glvalue başvurduğu nesneyi geçersiz işaretçi değeri içeriyorsa, bu davranış uygulama tanımlı.


Tarih:C 11 Bu " deditanımsızyerineuygulama tanımlı; DR1438 tarafından değiştirildi. Tam tırnak için bu yazının tarihi düzenleme.


p == q Uygulama:Diyelim ki biz kabul C 14 N4430 sonuç değerlendirme p q uygulama tanımlı, ve bu uygulama değil tanımlayan bir donanım tuzak oluşur; [ifade.eq]/2 diyor ki:

İki işaretçiler, aynı işlev için hem gelin hem boş olmaları durumunda eşit karşılaştırmak, ya da her ikisi de aynı Adres (3.9.2) temsil eder, aksi halde eşit olmayan karşılaştırır.

p q değerlendirildiğinde elde ne uygulama tanımlı olduğu için, burada ne olacağını kesin olarak söyleyemeyiz. Ama ya tanımlı uygulama ya da belirsiz olmalı.

g göründüğü için sergi belirlenemeyen bir davranış bu durumda; bağlı -O geçiş başardı üstüne şunu da 1 0 ilgili olsun veya olmasın aynı bellek adresi yeniden kullanılan b sonra a yok edildiğini.


N4430: hakkında notBu C henüz onaylanmamıştır 14, önerilen kusur bir çözüm. Yukarı kelimelerde bir sürü nesne yaşam süresi, geçersiz işaretçiler, subobjects, sendikalar ve dizi sınırları erişim çevreleyen temizler.

Belirtilir C 14 metin, altında [temel.stc.dinamik.kaldırma]/4 ve daha sonraki paragraflargeçersiz işaretçi değeridelete kullanıldığında ortaya çıkar. Ancak açıkça veya aynı prensip statik ya da otomatik depolama için geçerli olup olmadığını ifade değil.

Bir tanımı var "geçerli işaretçi" [temel.bileşik]/3 ama bunu makul bir şekilde kullanmak için çok belirsiz.[Temel.depolama her türlü hitap olduğunu gösteriyor hayat]/5 (Dipnot) statik depolama süresi nesnelere işaretçiler davranışları tanımlamak için aynı metni ifade eder.

N4430 metin tüm depolama süreleri için geçerli öyle anlaşılıyor ki, bu bir seviye yukarı bölümünde taşınır. Bir not iliştirilmiş

Not hazırlanması:bu dinamik depolama süresi sonunda tüm depolama süreleri için değil, sadece uygulamak gerekir. Bir uygulama iş parçacığı veya parçalı yığınları destekleyen, iplik ve otomatik depolama dinamik depolama aynı şekilde davranabilir.


Benim görüşüm:Standart (önceden N4430) p geçersiz işaretçi değer kazanır söylemekten başka yorumlamak için tutarlı bir yol göremiyorum. Davranışları zaten baktık ne başka bir bölüm tarafından karşılanacak gibi görünmüyor. Bu durumda standart niyet temsilcisi olarak N4430 ifadeler tedavisi için çok mutluyum.


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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • iNCH

    iNCH

    20 Temmuz 2009
  • Jason Parker

    Jason Parker

    14 Aralık 2009
  • Muse

    Muse

    28 EYLÜL 2006