SORU
18 Mart 2010, PERŞEMBE


Ne zaman bir üye çağırma tanımsız davranış null örneği sonuç üzerinde çalışıyor mu?

Aşağıdaki kodu göz önünde bulundurun:

#include <iostream>

struct foo
{
    // (a):
    void bar() { std::cout << "gman was here" << std::endl; }

    // (b):
    void baz() { x = 5; }

    int x;
};

int main()
{
    foo* f = 0;

    f->bar(); // (a)
    f->baz(); // (b)
}

Null işaretçi için 3* *ilgili üye yok çünkü (b) kaza bekliyoruz. Pratikte, (a) this işaretçiyi her zaman kullanılır, çünkü bir kaza değil.

(b) this işaretçisini ((*this).x = 5;) çözümlemesi ve this null olduğu için, program kaldırma boş hep tanımsız davranış " olarak tanımlanmamış bir davranışa girer.

(a) tanımsız davranışlara neden? Ne de kullanılması (x) statik dersin?

CEVAP
18 Mart 2010, PERŞEMBE


Her iki (a) (b) tanımsız davranışlara neden. Her zaman bir üyesi, bir null işaretçi işlevini çağırmak için tanımsız davranış. Eğer işlevi statik ise, teknik olarak tanımsız olarak iyi ama bazı anlaşmazlık var.


Anlamak için ilk şey, tanımsız davranış, bir null işaretçi çözümlemesi için kullanılır. C 03, aslında belirsizlik burada da var.

Rağmen< . em ^"boş bir işaretçi kaldırma tanımsız davranış olur§1.9/4 hem de notlarında belirtilen ve 8.3.2 §/4, hiçbir zaman açıkça ifade etti. (Notlar non-normatif olduğunu.)

Ancak, bunun sonucuna §3.10/2 deneyebilirsiniz:

Bir lvalue nesne ya da bir işlevi gösterir.

Kaldırma zaman, sonuç bir lvalue. Null bir işaretçideğiltanımsız davranış var lvalue kullandığımız zaman bir nesneye, bu nedenle bakın. Sorun önceki cümle asla, bu ne demek oluyor "" lvalue? kullanmak belirtilmiş. Hiç üretmek ya da kullanmak lvalue-rvalue dönüştürme işlemi daha resmi anlamda sadece bile?

Ne olursa olsun, kesinlikle bir rvalue (§4.1/1)dönüştürülemez:

Eğer nesneye olan lvalue anlamına gelir olmayan bir nesne türü T ve olmayan bir nesne, bir tür türetilmiş T veya nesne başlatılmamış, bir program gerektirir bu dönüşümü olan tanımsız davranış.

Burada kesinlikle tanımsız davranış.

Belirsizlik ya da saygı için tanımsız davranış olup olmadığını geliyorama kullanmak değilgeçersiz bir işaretçi (yani, bir lvalue ama bir rvalue dönüştürmek değil) değer. int *i = 0; *i; &(*i); tanımlanmış durumda. Bu active issue.

"Boş gösterici, tanımsız davranış çözümlemesi" görünüm ve "başvuru yapıldı boş bir işaretçi kullanın, tanımsız davranış" yaklaşımı. bir zayıf bir katı var

Şimdi soru olarak görüyoruz.


Evet, (a) tanımsız davranış oluşur. this null ise o zaman aslındaişlevi, içeriği ne olursa olsunsonuç tanımsızdır.

Bu 5.2.5/3 §izler:

Eğer E1 yazın “X” sınıfı, " ifade E1->E2 (*(E1)).E2; form eşdeğer dönüştürülür . işaretçi varsa

*(E1) sıkı bir yorumu ile tanımsız davranışlara neden olur ve .E2 bir rvalue için, zayıf yorumu için tanımsız davranış hale dönüştürür.

Ayrıca tanımsız davranış doğrudan(§9.3.1/1)gelen bu izler:

Eğer sınıf bir X, static üye işlev bir tür X türetilmiş tip X olmayan bir nesne için, ya da denir, davranışı tanımsızdır.


Statik fonksiyonları ile, sıkı karşı zayıf yorumu fark yaratıyor. Açık konuşmak gerekirse, tanımlanmamış

Statik bir üye bu durumda nesne ifade değerlendirilir sınıf üyesi erişim sözdizimini kullanarak ifade edilebilir.

Yani, eğer statik olmayan olsaydı sadece olarak değerlendirdi ve bir kez daha (*(E1)).E2 ile bir null işaretçi çözümlemesi.

Eğer zayıf yorumu kullanırsak E1 üye fonksiyonu statik bir çağrı kullanılmaz çünkü ancak çağrı tanımlanmış durumda. Bir lvalue, statik işlevi *(E1) sonuçlar giderildi *(E1) atılır ve işlev olarak adlandırılır. Lvalue-rvalue dönüşüm yok, tanımsız davranış var.

C n3126, belirsizlik olarak 0x kalır. Şimdilik, güvenli kullan: katı yorumu.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Google Chrome

    Google Chrom

    1 EYLÜL 2008
  • Motor Trend Channel

    Motor Trend

    11 Mart 2006
  • Roger Huffman

    Roger Huffma

    4 ŞUBAT 2007