2011-09-23 18 views
16

folowing kod bir çıkış beklenmemektedir gösterir:STL Vector, tahsis edilmemiş bir nesnenin yıkıcısını mı arıyor?

class test 
{ 
    public: 
    test() 
    { 
     std::cout << "Created" << (long)this << std::endl; 
    } 
    ~test() 
    { 
     std::cout << "Destroyed" << (long)this << std::endl; 
    } 
}; 

int main(int argc, char** argv) 
{ 
    std::vector<test> v; 
    test t; 
    v.push_back(t); 

    return EXIT_SUCCESS; 
} 

gösterir çalıştırıldığında:

Created-1077942161 
Destroyed-1077942161 
Destroyed674242816 

Ben ikinci "Tahrip" çıkışı olmamalıdır düşünüyorum. Vektörü kullanmadığımda, sonuç beklendiği gibi bir Oluşturulmuş ve bir Yokedilmiş satırdır. Bu davranış normal mi?

olması gerektiği gibi

+3

+1 [SSCCE] için (http://sscce.org/) – Flexo

+3

İşaretçileri yazdırmak için en iyi işaretçiyi yayınlamak en iyisidir: std :: cout << (void *) bu << std :: endl ; '. –

+0

Ayrıca 'EXIT_SUCCESS' iadesi de isteğe bağlıdır. Geri dönüş değerini "main" olarak iptal edebilirsiniz, 0 '(sizin platformunuz için hangi sayıya" normal sonlandırma "anlamına gelir) dönecektir –

cevap

31

Her şey (Bu FreeBSD üzerinde GCC ile derlenen): main() sonunda oluşturulan ve daha sonra yok edildi yerel değişken t, orada ve aldığı, v[0] var main()'un sonunda oluşturuldu ve yok edildi.

v[0]'un oluşturulmasını görmüyorsunuz, çünkü bu, sınamanızla veya test sınıfınızın sağlamadığı yapıcıyı taşıyarak gerçekleşir. bir zamanlar kendiniz için yazmak için kullanışlı test amaçlı olarak


(Yani derleyici. sizin için bir tane, ama çıkışı olmadan sağlar) ve tüm test sınıf için tüm olası kurucular, yıkıcı, atama ve takas operatörleri içerdiğini ve her birinde bir teşhis çizgisi yazdırır, böylece kaplarda ve algoritmalarda kullanıldığında nesnelerin nasıl davrandığına tanık olabilirsiniz.

+0

Bu, 'yapıcıyı taşı 'olamaz. – Nawaz

+0

@Namaz: Sağ. Taşımacıyı kullanmak için, eitehr 'v.push_back (std :: move (t))' veya 'v.push_back (test())' demeniz gerekir. Her ikisi de benzer bir mesaj dizisi oluşturur. –

29
#include <cstdlib> 
#include <vector> 
#include <iostream> 

class test 
{ 
    public: 
    test() 
    { 
     std::cout << "Created " << (long)this << std::endl; 
    } 
    test(const test&) 
    { 
     std::cout << "Copied " << (long)this << std::endl; 
    } 
    ~test() 
    { 
     std::cout << "Destroyed " << (long)this << std::endl; 
    } 
}; 

int main(int argc, char** argv) 
{ 
    std::vector<test> v; 
    test t; 
    v.push_back(t); 

    return EXIT_SUCCESS; 
} 

Çıktı:

Created -1076546929 
Copied 147865608 
Destroyed -1076546929 
Destroyed 147865608 

std::vector::push_back kopya t nesne, sen kopya kurucu görebilirsiniz Yukarıdaki kodla çağrı yapılmaktadır.

2

vektör nedenle push_back çağrısının ardından t bir kopyasını tutuyor, sen t iki sürümünü ... yığının üzerine bir tane ve vektör bir tane var. Vektör sürümü bir kopya-oluşturucu tarafından oluşturulduğundan, bu nesne için bir "Oluşturuldu ..." istemi görmüyorsunuz ... ancak vektör kabı kapsam dışına çıktığında hala imha edilmelidir, "Yokedildi" mesajları.