2016-10-29 23 views
14

bu kodu dikkate alınız C++ içinde anlambilim kopya Başlarken: yapıcı ve yıkıcı iki defa çağrılıretrafında

class A 
{ 

}; 

int main() 
{ 
    std::vector<A> test; 
    test.push_back(A()); 
} 

, ayrıca hafıza iki kez tahsis edilecek ve nesne kopyalanan olacak, artık sadece söz konusu potansiyel olarak kötü performans ayrıca çalışma zamanı hatalarına da yol açabilir, özellikle de yıkıcıda bir miktar temizleme varsa. Ben genellikle bu çevrede alırdım yolu sadece yerine işaretçiler vektör oluşturmaktır:

std::vector<A*> test; 
test.push_back(new A()); 

Sorum, bu genel bir uygulamadır kat ikidir ve iyi uygulamadır? Yoksa daha iyi bir yolu var mı? Bu bir dupe olduğu ortaya çıkarsa lütfen bana bildirin ve soruyu kapatacağım, ancak arama konusunda hiçbir şey bulamadım.

+7

* İşaretçi kullanma * yaygın bir uygulamadır. Ve * değil * işaretçileri kullanarak iyi bir uygulamadır. İşaretçiler kullanmadıysanız ve bir * hareket * yapıcısını uyguladıysanız daha iyi bir uygulama olacaktır. –

+0

hala, "std :: vector test", listede polimorfizm gerektiğinde gereklidir (ve B, temel sınıftır). Ama sadece burada ... ve bellek sızıntıları/çift özgürlüğün kötü olduğunu kabul ediyorum. –

+0

Daha iyi bir yol, B için bir hareket yapıcıyı uygulamaktır. –

cevap

24

emplace_back'u kullanın.

std::vector<A> test; 
test.emplace_back(); 
//test.emplace_back(constructor, parameters); 

Bu şekilde, A yerinde inşa edilecek, böylece hiçbir kopyalama veya taşıma meydana gelecektir.

Düzenleme: Soruyu açıklığa kavuşturmak için - Hayır, bu bir geçerse push_back değiştirmez. Örneğin,

test.emplace_back(A{}); 

Will C++ 11'inde, geçici bir inşa taşındı ve push_back kullanıldığı gibi, tahrip edilmesine neden.

İlgili konular