C# dünyasından geldiğimde, atandığım bir C++ projesinde bellek sızıntılarını ve hatalarını tanıtmamaya çalışıyorum. Veri arabelleğinden bilgi ayrıştırmak için yapıları kullanan kod yazıyorum. Arabellekte görünen veri yapılarının sayısı çalışma zamanında değişebildiğinden, işlenen verileri depolamak için bir stl vektörü kullanılır. Ben mevcut yazılımda aşağıdaki kod bloğu karşılaştım ve çalıştığını anlamak mücadele ediyorum:STL Vektörleri İçinde Kapsamı ve Nesne Ömrünü Yönetme
MyVectorOfObjects.clear();
for (unsigned __int8 i = 0; i < NumberOfObjects; i++)
{
MyParserObject parserObject; // Declaring without 'new'?
parserObject.Decode(buffer, offset, size); // A method on the struct.
MyVectorOfObjects.push_back(parserObject); // Does this keep parserObject in scope?
}
Sorularım özellikle şunlardır: this question göre
, olur değil
parserObject
gitmeknew
anahtar sözcüğünden beri kapsam dışı her yineleme kullanılmıyor? Açıkçası bu kod çalışıyor.Bu durumda, nesneyi
vector
içine yerleştirmekparserObject
kapsamını içeride tutuyor mu?this question'a göre, parserObject kopyalanır. Bu durumda, bunun performans sonuçları (ör. Hafıza tüketimi, bellek ayırma, vb.) Nelerdir? Ayrıca, kopyalanan parserObjects daha sonra vektörle aynı kapsamı alsın mı?
Yardımlarınız için teşekkür ederiz.
Bu biraz temel C++. [İyi tanıtım C++ kitabı] (http://tinyurl.com/so-cxxbooks) almayı ve ondan öğrenmeyi öneririm.C++ ve C# arasındaki büyük bir farkın farkına varmanız gerektiği söyleniyor: C++ 'da, değişkenler arasında * değerleri * (açıkça referanslar olarak belirtilmemişse) C#' da bulunurken, çoğu değişkende * referanslar bulunur * (tabii ki saymazsınız) değer türleri. –
'MyParserObject parserObject;' ile, bu bellek otomatik olarak program tarafından yönetilir - bunu uygulamada gerçekleşmesi gerekmediği halde, 'for'-loop'dan hemen sonra' delete parserObject 'olarak düşünün. –
@ R.Martinho Referans ve teşekkürler için teşekkürler. – bporter