SORU
22 HAZİRAN 2011, ÇARŞAMBA


Yerel bir değişken'in hafıza kapsamı dışında erişilebilir mi?

Aşağıdaki kodu var.

int * foo()
{
    int a = 5;
    return &a;
}

int main()
{
    int* p = foo();
    cout << *p;
    *p = 8;
    cout << *p;
}

Ve kodu Hayır Çalışma Zamanı özel durumları ile çalışıyor!

Çıkışı 5 8 oldu

Nasıl olabilir? Yerel bir değişken hafıza fonksiyonu dışında ulaşılmaz değil mi?

CEVAP
22 HAZİRAN 2011, ÇARŞAMBA


Nasıl olabilir? Yerel bir değişken hafıza fonksiyonu dışında ulaşılmaz değil mi?

Sen kiralık bir otel odası. Yatağın yanındaki masanın üst çekmecesinde bir kitap koy ve uyu. Ertesi sabah check out, ama "" anahtarını geri ver. unut Anahtarı çalmak!

Bir hafta sonra, otele dönüş, kontrol, çalıntı anahtar ile eski odana gizlice, çekmeceye bak. Kitabın hala var. Şaşırtıcı!

Bu nasıl olabilir? Eğer oda kiralamış olsanız bile otel odası çekmece ulaşılmaz içeriğini değil mi?

Açıkçası bu senaryo gerçek dünyada sorun olabilir. Kitabın artık odaya girmeye yetkiniz zaman kaybolmasına neden olan gizemli bir güç yok. Ne de çalıntı bir anahtarla odaya girmesini engelleyen gizemli bir güçtür.

Otel yönetimi değildirgereklikitap çıkarmak için. Eğer bir şeyleri geride bırakmak, sizin için onu parçalara ayırırlar dedi onlarla bir sözleşme yapmadın. Yeniden girin geri almak için çalıntı bir anahtar ile odanda yasadışı, otel güvenlik personeli değildirgereklisen gizlice yakalamak için. "Eğer geri odama sonra gizlice etmeye çalışırsam, beni durdurmak için gereklidir." dedi onlarla bir sözleşme yapmadın Daha doğrusu, "ben", bir sözleşme . daha sonra gizlice odama söz söyledi ki onlarla bir sözleşme imzaladı ^em>kırdın.

Bu durumdaher şey olabilir. Kitap orada şanslısın olabilir. Başkasının kitap var ve senin otelin fırında olabilir. Birisi içeri girdiğinde orada, paramparça kitabını yırtılma olabilir. Otel tamamen masa ve kitap kaldırmış ve bir dolap ile yer değiştirdi. Tüm otel, yıkılmak üzere ve bir Futbol Stadyumu ile değiştirilebilir, ve gizlice sırasında meydana gelen patlamada öleceksin.

Bilmiyorum ne olacak; ne zaman teslim otelin çaldı ve bir anahtar için yasadışı olarak kullanın daha sonra vazgeçti hakkı yaşarız öngörülebilir, güvenli bir dünya çünküsanasistemin kuralları kırmak için seçti.

C güvenli bir dil değildir. Neşeyle sistem kuralları kırmak için izin verir. Eğer sen denemek için bir şey yasadışı ve aptal gibi gerisin geri bir oda değilsin yetkili olmak ve karıştırmak yoluyla bir masa olmayabilir de bile var artık C değil seni durduramayacak. C -- gücünüzü çok daha sıkı olması kısıtlayarak bu sorunu çözmek anahtarları üzerinde kontrol daha güvenli diller, örneğin.

GÜNCELLEME

Kutsal Tanrım, bu cevap ilgi çok oluyor. (Sadece "" küçük bir benzetme, ama neyse.) eğlenceli olacağını düşündüm neden emin değilim

Bu daha teknik bir kaç düşünce ile biraz güncelleme ile ilgili olabilir diye düşündüm.

Derleyicileri, veri depolama yöneten kod oluşturma iş programı tarafından manipüle. Kod belleği yönetmek üreten, farklı birçok yolu vardır, ama zaman içinde iki temel teknikleri yerleşmiş hale gelmiştir.

İlk olduğu için bir tür "uzun ömürlü" depolama alanı nerede "ömür boyu" her bayt depolama, dönemin zaman zaman kendileri ile ilgili bazı program değişken -- olamaz kolayca tahmin aramam gerek. Derleyici "" dinamik gerektiğinde depolama tahsis ve artık gerekli olduğunda geri. bilen yöneticisi yığın çağrıları oluşturur

İkincisi için bir tür "kısa ömürlü" depolama alanı nerede hayatının her bayt depolama bilinen, ve özellikle, yaşam depoları izleyin bir "yuva" desen. Yani, kısa ömürlü değişkenlerin en uzun ömürlü tahsisi kesinlikle bundan sonra gelen kısa ömürlü değişkenlerin ayırma çakışıyor.

Yerel değişkenler ikinci düzen izleyin; bir yöntem girildiğinde, yerel değişkenler canlanıyor. Bu yöntem başka bir yöntemi çağırdığında, yeni yöntem yerel değişkenler canlanıyor. İlk yöntem yerel değişkenler öldü önce ölmüş olacaklar. Depoların yerel Değişkenler ile ilişkili yaşam başlangıçlar ve sonlar göreli sırasını önceden çalışmış olabilir.

Bu nedenle, yerel değişkenler genellikle oluşturulan depolama için bir "yığın" veri yapısı, çünkü bir yığın vardır bu özellik ilk şey itti olacak son şey fırladı.

Otel odaları sırayla kiraya vermeye karar verir ve oda numarasını daha yüksek olan herkes teslim kadar kontrol edebilirsiniz.

Hadi yığını düşünün. Çoğu işletim sistemi tek başına iş parçacığı yığın ve yığın belirli bir boyutu tahsis edilir. Bir yöntem çağırdığınızda, eşyaları da yığına itilir. Eğer o zaman senin yöntemin arkada bir yığın için bir işaretçi geçirmek Gönderen burada yaptığı gibi, o sadece tamamen geçerli bir milyon bayt bellek bloğu biraz ortasına bir işaretçi. Bizim benzetme, otel kontrol edin; bunu yaptığınızda, size sadece en yüksek numaralı işgal odadan kontrol etti. Kimse seni sonra kontrol etmeliyiz, ve odana yasadışı yollardan gidersen, tüm eşyaların hala orada olması sağlanırbu özel otel.

Gerçekten ucuz ve kolay olduğu için geçici depolar için yığınları kullanıyoruz. C uygulaması yerliler depolama için bir yığın kullanmak için gerekli değildir; yığın kullanın. Bu program daha yavaş olur çünkü mi, değil.

Bir uygulama C Gerekli değil bırakın çöp bıraktın yığını dokunulmamış, böylece geri gelmek için daha sonra yasadışı olarak; tamamen yasal için derleyici kodu oluşturmak için bu geri dönüşler için her şeyi sıfır "oda" sadece boşalan. Pahalı olur yine, çünkü değil.

C bir uygulama mantıklı küçülür, yığın, geçerli olması için kullanılan adresler hala belleğe eşlenmiş olduğundan emin olmak için gerekli değildir. Uygulama işletim sistemi "şimdi. yığının Bu sayfayı kullanarak olduğumuzu söylemek için izin verilir Ben aksini söyleyene kadar kimse dokunursa sürecini tahrip eden bir durum sorunu daha önce geçerli sayfa yığını". Yine, uygulamaları aslında yavaş ve gereksiz olduğundan bunu yapma.

Bunun yerine, uygulamalar, hata yapar ve yanına kar edelim. Çoğu zaman. Ta ki bir gün bir şey korkunç yanlış gider ve süreci patlar.

Bu sorunlu. Kuralları bir yeri vardır ve çok kolay yanlışlıkla kırmak için. Kesinlikle birçok kez. Daha da kötüsü, sorun genellikle sadece bellek çok zor berbat kim olduğunu bulmak için zaman yolsuzluk oldu sonra nanosaniye bozuk milyarlarca tespit edildiğinde yüzeyler.

Daha fazla bellek-güvenli diller gücünü kısıtlayarak bu sorunu çözmek. "Normal" C# sadece yerel ve geri dönüş adresini almak için bir yol veya sonrası için saklamak yok. Bir yerel adresini alabilirsin, ama dili imkansız yerel sona erer ömrü sonra kullanmak için zekice tasarlanmıştır. Bir yerel adresini alıp kutuyu arkaya için, size özel "" modunda . güvensiz derleyici koymak zorunda ^em>vekelime":" programın, muhtemelen kuralları ihlal edilebilir tehlikeli bir şey yapıyorsun aslında dikkat çekmek için. güvensiz koy

Daha fazla okuma için:

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Absolute Zero(Programming Tutorials)

    Absolute Zer

    22 Kasım 2012
  • Kanaal van Dj0fifty

    Kanaal van D

    28 EKİM 2011
  • Justin Davis

    Justin Davis

    14 Ocak 2008