SORU
7 EYLÜL 2011, ÇARŞAMBA


Olacak goto sızıntısı değişkenleri kullanarak?

goto yıkıcılar ve şeyler aramadan kod parçaları arasında atlar doğru mu?

örneğin

void f() {
   int x = 0;
   goto lol;
}

int main() {
   f();
lol:
   return 0;
}

x sızdırılmış olacak?

CEVAP
7 EYLÜL 2011, ÇARŞAMBA


Uyarı:Bu cevap C ilgilidirsadece; kuralları C. oldukça farklıdır


x sızdırılmış olacak?

Hayır, kesinlikle değil.

goto C geçersiz kılmak için izin veren bazı düşük düzeyde inşa 's inşa kapsayan mekanizmaları. bir efsanedir (Eğer bir şey, bu eğilimli olabilir longjmp.)

Ne yapmasını engellemek için aşağıdaki mekaniği "" etiketleri case etiketleri içerir). kötü şeyler düşünün


1. Kapsam etiket

Fonksiyonlar üzerinden atlayamazsın:

void f() {
   int x = 0;
   goto lol;
}

int main() {
   f();
lol:
   return 0;
}

// error: label 'lol' used but not defined

[n3290: 6.1/1]: [..] bir etiket kapsamı içinde işlevidir görünüyor. [..]


2. Başlatma nesne

27**:

int main() {
   goto lol;
   int x = 0;
lol:
   return 0;
}

// error: jump to label ‘lol’
// error:   from here
// error:   crosses initialization of ‘int x’

Atlarsangerikarşısında hazırlama, the object's previous "instance" is destroyed nesne:

struct T {
   T() { cout << "*T"; }
  ~T() { cout << "~T"; }
};

int main() {
   int x = 0;

  lol:
   T t;
   if (x   < 5)
     goto lol;
}

// Output: *T~T*T~T*T~T*T~T*T~T*T~T

[n3290: 6.6/2]: [..] geri bloğu dışında bir döngü, ya da Transfer otomatik depolama süresi ile başlatılan bir değişken içerir geçmiş otomatik depolama süresi ile nesneleri imha bu noktada kapsam transfer ama nokta transfer değil için. [..]

Eğer açıkça başlatıldığını bile 29**,:

int main() {
   goto lol;
   {
      std::string x;
lol:
      x = "";
   }
}

// error: jump to label ‘lol’
// error:   from here
// error:   crosses initialization of ‘std::string x’

... dil gerekmez çünkü ne olursa olsun başa çıkabilecek certain kinds of object hariç "karmaşık" yapı

int main() {
   goto lol;
   {
      int x;
lol:
      x = 0;
   }
}

// OK

Bir blok içine transfer etmek mümkün, ama değil [n3290: 6.7/3]: başlatma ile ilgili tanımlamalar atlar bir şekilde. Bir program otomatik depolama süresi ile bir değişken bir noktadan atlar kapsam içinde olduğu bir noktaya kapsamında değilse, hatalı biçimlendirilmiş sürece. değişken skaler türü, önemsiz varsayılan türü dersi var yapıcı ve önemsiz bir yıkıcı, bir cv nitelikli bir sürümü bu tür, ya da bir önceki türleri ve bildirilen bir dizi bir başlatıcı olmadan. [..]


3. Diğer nesnelerin kapsamına uymaktadır atlama

Aynı şekilde, otomatik depolama süresi ile nesneleri are not "leaked" when you goto out of their scope:

struct T {
   T() { cout << "*T"; }
  ~T() { cout << "~T"; }
};

int main() {
   {
      T t;
      goto lol;
   }

lol:
   return 0;
}

// *T~T

Bir kapsamdan çıkış (ancak başarılı) [n3290: 6.6/2]: nesneleri inşa edilmiş olan otomatik depolama süresi (3.7.3) bu kapsam yapı ters sırada yok. [..]


Sonuç

Yukarıdaki mekanizmaları goto dili kırmak izin vermez emin olun.

Tabii ki, bu otomatik olarak "sorun, ama verilmiş . herhangi bir goto kullanmak gerektiği anlamına gelmez ^em>yok"yaygın efsane, insanları inandırır. "kötülük yaklaşık olarak yani

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Just So

    Just So

    3 HAZİRAN 2007
  • My Name Is Jeff

    My Name Is J

    26 ŞUBAT 2008
  • Warner Bros. UK

    Warner Bros.

    6 HAZİRAN 2008