2013-07-08 16 views
10

Bu kodda bellek bozulmasına vardır:Bellek bozulması :: initializer_list

#include <string> 
#include <iostream> 
#include <vector> 
#include <initializer_list> 

int main() { 
    std::vector<std::initializer_list<std::string>> lists = { 
     { 
      {"text1"}, 
      {"text2"}, 
      {"text3"} 
     }, 
     { 
      {"text4"}, 
      {"text5"} 
     } 
    }; 

    int i = 0; 
    std::cout << "lists.size() = " << lists.size() << std::endl; 
    for (auto& list: lists) { 
     std::cout << "lists[" << i << "].size() = " << lists[i].size() << std::endl; 
     int j = 0; 
     for (auto& string: list) { 
      std::cout << "lists[" << i << "][" << j << "] = "<< string << std::endl; 
      j++; 
     } 
     i++; 
    } 
} 

Numune çıkışı:

lists.size() = 2 
lists[0].size() = 3 
lists[0][0] = text10�j ����text2H�j ����text3`�j ����text4����text5��������q 

sorun std::initializer_list içindedir. std::initializer_list'un std::vector ile değiştirilmesi sorunu çözer.

Bellek bozukluğu neden std::initializer_list ile gerçekleşir? Çünkü std :: string nesneleri

+26

'std fazla ayrıntı :: bir nedeni onların adı var initializer_lists' bulabilirsiniz. Sadece uzun süreli depolama için değil, * başlatma için * kullanılması gerekiyordu. Bu yüzden referans semantikleri var. Tüm 'std :: initializer_list's aslında sadece' listeler'in başlatılmasının sonuna kadar yaşayacaktır. – Xeo

+6

'^^' Bu yorum sistem tarafından resmi olarak sorunuza doğru cevap olarak kabul edildi. Hizmetlerimizi kullandığınız için teşekkür ederiz! –

cevap

1

bu satırdan önce yıkıldı: std :: string kendi yıkıcılar ve vektörlerin içine klonlanabilir içinde ayıklama çıkışı

int i = 0;

edin. std :: string :: dize 5 kez, std :: string :: ~ dize 5 kez ve bu

lists.size sonra() = yüzünden 2

: Şöyle birşey göreceksiniz edilecek std :: string nesnelerin kopyasını içermeyen initializre_list, onlar (geçici std :: string objects0 yeni oluşturulan ve daha önce tahrip ';'

O std için :: dize nesne böyle ifadede almak referans gibi örneğin içindir:

std :: cout < < std :: string ("17");

Ancak, std :: string'ini "const char *" ile değiştirirseniz, örneğiniz çalışmalıdır, sanırım.

int i = 0; 

Onun ayrıntıları uygulama spesifik, ama genel olarak inşaat dinamik bir dizi oluşturur ve bu dinamik dizi imha imha edilir: başlatıcı listesi için

İlgili konular