2013-01-16 15 views
6

Programımda bir şey oldu ve olması gerekip gerekmediğini göremiyorum. Ve eğer, neden görmüyorum .. İşte Nesnelerin bir vektörünü başlatırken ve yeniden boyutlandırırken yıkıcı neden çağrılır?

kod:

#include <iostream> 
#include <vector> 

using namespace std; 

class A{ 
    public: 
    A(); 
    ~A(); 
}; 

A::A(){ 
    cout << "creating" << endl; 
} 

A::~A(){ 
    cout << "deleting" << endl; 
} 

int main(void){ 
    vector<vector<A > > vec; 

    vec.resize(5); 
    for(int i = 0; i < 5; ++i){ 
    vec[i].resize(5); 
    } 

    cout << "END" << endl; 

    return 0; 
} 

Ve burada çıkış var: Ben yıkıcı sonra denir anlamak

creating 
deleting 
creating 
deleting 
creating 
deleting 
creating 
deleting 
creating 
deleting 
END 
deleting 
deleting 
[..more deleting here] 

" END "mesajı, ama önce, ben yok. Vektör yeniden boyutlandırıldığında, sınıfın kurucusunun çağrıldığını, ancak neden yıkıcı olduğunu düşündüm?

+0

Kopyalama katsayısını kullanıcı tanımlıyorsunuz. Eğer (çıktı ile) yaparsanız ve yeniden boyutlandırmak için her bir çağrıdan sonra bir çıkış yaparsanız(), neler olduğunu göreceksiniz. –

cevap

17

C++ 03'de, A() varsayılan değeri olan varsayılan bir parametresi vardır. Bu geçici olan yok oldu. Vektörlerin elemanları ondan kopyalanır.

Bu, C++ 11'de resize'un iki aşırı yüklenmesinin olduğu "sabit" dir. Birinin tek bir parametresi vardır ve herhangi bir ek öğeyi değer olarak başlatır. Diğeri iki parametreye sahiptir ve her ek elemanı sağlanan değerden kopyaya ilklendirir. C++ 11 Bu programda bu davranışı vardır: A örneğidir bunun sayısını en aza indirir değer olduğunu hazırlamak o kadar şok edici pahalı ise, C++ 03 yılında

creating 
creating 
creating 
<repeated for a total of 25 "creating"s> 
creating 
creating 
creating 
END 
deleting 
deleting 
deleting 
<repeated for a total of 25 "deleting"s> 
deleting 
deleting 
deleting 

, o zaman 5 NO onu tıraş olabilir -args- + 25 kopya-yapılar aşağı 1 no-arg- ve böyle bir şey ile 25 kopya-yapılara:

A default_value; 
for (int i = 0; i < 5; ++i) { 
    // same end result as vec[i].resize(5) 
    if (vec[i].size() >= 5) { 
     vec[i].erase(vec.begin() + 5, vec.end()); 
    } else while(vec[i].size() < 5) { 
     vec[i].push_back(default_value); 
    } 
} 

muhtemelen örnek kodu için açıkçası biraz farklı bir şekilde yazmak ve olabilir değil mi "if" vakasına ihtiyacım var. Ama "başka bir süre" demek için pek çok fırsatım yok, ben de alıyorum.

+0

Bu kodun C++ 11'de tamamen farklı davrandığından bahsetmeye değer. – Csq

+0

@Csq: Evet, senden öndeyim. "Zorlukla" eşit "yol" değerleri için. Ben sadece bu bit :-) –

+0

Tamam göndermeden önce standart kontrol ediyordu ... böylece C++ 11 olmadan düzeltmek için bir yolu yok? Teşekkürler :) – user1729422

İlgili konular