2013-07-08 15 views
10

는이 코드에서 메모리 손상이 있습니다메모리 손상 :: 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++; 
    } 
} 

샘플 출력 :

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

문제는 std::initializer_list에서입니다. std::initializer_list에서 std::vector으로 변경하면 문제가 해결됩니다.

왜 메모리 손상이 std::initializer_list으로 발생합니까? 때문에 표준 : : 문자열 개체의

+26

'표준에서 더 자세히 : 이유가 자신의 이름이 initializer_lists'을 찾을 수 있습니다. 장기 저장이 아닌 초기화 *에만 사용해야합니다. 그것이 참조 의미론을 갖는 이유입니다. 모든'std :: initializer_list'는 실제로'lists'의 초기화가 끝날 때까지만 유효합니다. – Xeo

+6

'^^'이 의견은 귀하의 질문에 대한 정답으로 공식적으로 받아 들여졌습니다. 우리의 서비스를 이용해 주셔서 감사합니다! –

답변

1

이 라인 전에 파괴되었다 : 표준 : : 문자열 소멸자와 ctors에 디버그 출력이

int i = 0;

합니다. 표준 : : 문자열 : 문자열의 5 배, 표준 : : 문자열 : ~ 문자열 5 배 그

lists.size 후() =의 때문에 2

을 : 당신은 같은 것을 볼 것이다 표준 : : 문자열 객체의 복사본을 포함하지 initializre_list, 그들은 (일시적인 표준 : : 문자열 objects0 바로 생성하기 전에 파괴가 ','

그것은 수 std :: 문자열 객체 을 그런 식 테이크 참조처럼, 예를 들면 :

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

하지만 예제에서 std :: string을 "const char *"로 바꾸면 모두 작동합니다.

int i = 0; 

그것의 세부 구현 spesific하지만, 그것은 일반적으로 건설에서 동적 배열을 생성하고,이 동적 배열은 파괴에 파괴 : 초기화 목록