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
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
Belirli bir satır numarası Unıx Az kul...
Son Java değişkenleri kullanarak çöp t...
Sinek dize değişkenleri kullanarak Jav...
Kullanarak "çift" döngüler o...
'kullanarak ilgili görüşlerinizi ...