2008-08-27 4 views
4

, ben de içeren this post rastladım buC++ - "Yığın otomatik" ne anlama geliyor? Internet arasında benim browsings olarak

"(Eh yazılı) C++ yığını otomatik nesneleri çalışması için harika elinden gider 'yansıtılan , sadece ilkel' gibi . için Stroustrup'un tavsiyesi bu Odaklı Nesne ilkelerine bir çok daha büyük bağlılığı gerektirir "int gibi yapmak" gelişimi: sınıf doğru değil aşağıdaki int, "gibi çalışır" kadar " Üç Kuralı " guara ntees olabilir (sadece int gibi) oluşturulabilir, kopyalanabilir ve doğru bir yığın olarak imha edilebilir. "

Biraz C ve C++ kodu yaptım, ama sadece geçerken, hiçbir zaman ciddi bir şey, ama sadece merak ediyorum, tam olarak ne anlama geliyor?

Birisi örnek verebilir mi?

cevap

12

Yığın nesneleri, derleyici tarafından otomatik olarak işlenir.

Kapsam bırakıldığında silinir. Eğer bir bellek sızıntısı olsun bir 'Yenilenmistir' nesnesi ile aynı şeyi yaparken

{ 
    obj a; 
} // a is destroyed here 

:

{ 
    obj* b = new obj; 
} 

b tahrip edilmez, bu yüzden b sahibi bellek geri yeteneğini kaybetti. Ve belki daha kötüsü, nesne kendini temizleyemez.C

aşağıdaki yaygındır:

{ 
    FILE* pF = fopen(...); 
    // ... do sth with pF 
    fclose(pF); 
} 

C++ biz bunu yazmak: Biz dosya kapanmamış C örneğinde fclose aramayı unutma ve olmayabilir

{ 
    std::fstream f(...); 
    // do sth with f 
} // here f gets auto magically destroyed and the destructor frees the file 

diğer programlar tarafından kullanılır. (ör. silinemez). Başka bir örnek, kapsamdan çıkarken tahsis edilen ve imha edilen, oluşturulabilen nesne dizgisini gösterir. diğer cevaplara ek olarak

{ 
    string v("bob"); 
    string k; 

    v = k 
    // v now contains "bob" 
} // v + k are destroyed here, and any memory used by v + k is freed 
+0

Bu özellik, kaynak edinimi ve serbest bırakılması için Kaynak Alması Başlatılıyor (RAII) deyimi aracılığıyla otomatik olarak yönetmek için C++'da yaygın olarak kullanılır. –

+0

Tamsayısı için: http://en.wikipedia.org/wiki/RAII –

+0

Sadece küçük bir anlatım sorunu: Her değişken, kapsamı/ömrü bittiğinde yok olur, bu yüzden, aslında, "obj * b", "yok edilir" ". Onun yıkıcısı hiçbir şey yapmaz ve böylece 'yeni obj' silinmez. Sadece işaretçinin türünü değiştirerek, yani. smart_ptr 'bir yıkıcıya sahiptir, kapsam belirleme yoktur, ancak nesneler silinir. – quetzalcoatl

1

C++'daki değişkenler yığın veya yığın üzerinde bildirilebilir. C++ 'da bir değişken bildirdiğinizde, yeni operatörü açıkça kullanmazsanız (yığına gider), otomatik olarak yığına gider.

MyObject x = MyObject(params); // onto the stack 

MyObject * y = new MyObject(params); // onto the heap 

Bu, belleğin yönetilme biçiminde büyük bir fark yaratır. Bir değişken yığında bildirildiğinde, kapsam dışına çıktığında ayrılmış olur. Silme açıkça nesneye çağrılana kadar yığındaki bir değişken yok olmaz.

+0

Aslında orada dikkatli olmak istersiniz. Her ne kadar hepimiz global verileri biliyor olsak da, global/statik verilerin bulunduğu veriler (başlatılmış) ve BSS (başlatılmamış) segmentlerini unutmayın. – Dan

1

Yığın otomatik, geçerli yöntemin yığına ayrılan değişkenlerdir. Yığını otomatik olarak işleyebilecek bir sınıf tasarlama fikrinin amacı, bir çağrı ile tam olarak başlatılmasının ve bir diğeriyle imha edilmesinin mümkün olması gerektiğidir. Yıkıcının, nesne tarafından tahsis edilen tüm kaynakları serbest bırakması ve kurucusunun tamamen başlatılmış ve kullanıma hazır bir nesne döndürmesi esastır. Kopyalama işlemi için de benzer şekilde - sınıf, tamamen işlevsel ve bağımsız olan, kolayca kopyalanabilmelidir.

Böyle bir sınıfın kullanımı, ilkel int, float vb. Nasıl kullanıldığına benzer olmalıdır. Onları tanımlarsınız (sonunda bir başlangıç ​​değeri verirsiniz) ve sonra bunları geçirirsiniz ve sonunda derleyiciyi temizliğe bırakırlar.

2

:

C++ dilinin aslında açıkça bir nesnenin depolama sınıfını bildirmek auto anahtar kelime vardır. Tabii ki, tamamen gereksizdir, çünkü bu yerel değişkenler için zımni depolama sınıfıdır ve hiçbir yerde kullanılamaz. auto'un tam karşılığı static (hem yerel hem de globall).

aşağıdaki iki bildirim eşdeğerdir: Anahtar kelime tamamen yararsız

int main() { 
    int a; 
    auto int b; 
} 

Çünkü, aslında bir sonraki C++ standardında geri dönüşümlü olacak (“C++ 0x”) ve yani yeni bir anlam alır bu derleyici onun başlatma gelen değişken türünü tahmin sağlayan (C# var gibi):

auto a = std::max(1.0, 4.0); // `a` now has type double. 
1

yanılıyorum, ama ben kopyalama işlemi otomatik yığının tam olarak yararlanmak için zorunlu olmadığını düşünüyorum varsa düzelt temizlik. Örneğin klasik bir MutexGuard nesnesini düşünün, yığın yığını olarak faydalı olması için bir kopyalama işlemine ihtiyaç duymaz, ya da yapar?

+0

Bu doğru. Birisinin otomatik olarak arama yapmasını engellemek için kopya kurucuyu gizli (veya C++ 0x, silinmiş) olarak bildirmeniz gerekir; Üçüncüsü, bir kopya kurucuyu tanımlamanız gerektiğini söylemez, derleyicinin bir tanesini belirlemesini engellemeniz gerektiğini söyler (ya kendi başınıza sağlayarak ya da erişilemeyen/silinerek). –