2013-07-08 17 views
10

Mam uszkodzenia pamięci w tym kodzie: wyjścieuszkodzenie pamięci z std :: 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++; 
    } 
} 

próbki:

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

problem jest w std::initializer_list. Zmiana std::initializer_list na std::vector rozwiązuje problem.

Pytanie brzmi, dlaczego uszkodzenie pamięci ma miejsce pod numerem std::initializer_list?

+26

'std :: initializer_lists' mają swoje nazwy bez powodu. Mają być używane tylko * do inicjalizacji *, a nie do przechowywania długoterminowego. Dlatego mają semantykę odniesienia. Wszystkie twoje 'std :: initializer_list's faktycznie działają tylko do końca inicjalizacji' list'. – Xeo

+6

'^^' Ten komentarz został oficjalnie zaakceptowany przez system jako poprawna odpowiedź na twoje pytanie. Dziękujemy za korzystanie z naszego serwisu! –

Odpowiedz

1

Ponieważ std :: obiektów smyczkowych zostały zniszczone przed tym wierszu:

int i = 0;

Jeśli std :: string ma wyjście debugowania w swoich destruktorów i ctors. Będziesz zobaczyć coś takiego: std :: string :: string 5 razy, std :: string :: ~ strunowe 5 razy a potem

lists.size() = 2

powodu initializre_list nie zawierać kopię obiektów std :: string, oni (tymczasowy std :: string objects0 właśnie tworzone i niszczone przed „;”

jest na przykład jak odniesienie do odbioru obiektu std :: ciąg w takiej wypowiedzi:

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

Ale jeśli zastąpisz std :: string przez "const char *" w twoim przykładzie, wszystko powinno działać, jak przypuszczam.

1

bagażu na liście inicjatora zostaje zniszczony po użyciu, co jest przed linią:

int i = 0; 

Jej szczegóły są realizacja Spesific, ale generalnie tworzy dynamiczną tablicę w budowie i to dynamiczna tablica jest zniszczona na zniszczenia.

można znaleźć więcej szczegółów na cppreference page

Powiązane problemy