2013-07-08 15 views
10

ho corruzione della memoria in questo codice: uscitala corruzione della memoria con 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++; 
    } 
} 

Esempio:

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

Il problema è in std::initializer_list. La modifica di std::initializer_list a std::vector risolve il problema.

La domanda è: perché la corruzione della memoria avviene con std::initializer_list?

+26

'std :: initializer_lists' hanno il loro nome per un motivo. Dovrebbero essere usati * solo per l'inizializzazione *, non per l'archiviazione a lungo termine. Ecco perché hanno una semantica di riferimento. Tutti i tuoi 'std :: initializer_list's in realtà vivono solo fino alla fine dell'inizializzazione di' lists'. – Xeo

+6

'^^' Questo commento è stato ufficialmente accettato dal sistema come risposta corretta alla tua domanda. Grazie per aver utilizzato i nostri servizi! –

risposta

1

A causa di std :: oggetti stringa sono state distrutte prima di questa linea:

int i = 0;

Se std :: string ha output di debug nelle loro distruttori e ctors. Sarete vede qualcosa di simile: std :: string :: string 5 volte, std :: string :: ~ stringa 5 volte e dopo che

lists.size (2) =

A causa di initializre_list non contengono copia di oggetti std :: stringa, essi (temporanea objects0 std :: string appena creato e distrutto prima ';'

è ad esempio come take riferimento a std :: oggetto stringa in tale espressione:

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

Ma se si sostituisce std :: string con "const char *" nell'esempio tutto dovrebbe funzionare, suppongo.

1

bagagli per lista di inizializzazione è distrutto dopo l'uso, che è prima linea:

int i = 0; 

I suoi dettagli sono l'attuazione spesific, ma crea generalmente una matrice dinamica in costruzione e questo array dinamico viene distrutto distruzione.

Potete trovare maggiori dettagli a cppreference page

Problemi correlati