2016-06-01 3 views
-2

필링 : 여기C++, 구조체 벡터 내가 구조체 벡터 채우는 문제가있어

는 구조체입니다 :

struct indx{ 
    int inK; 
    char* surn; 

    indx(int k, char* s) : inK(k), surn(s) {} 
    indx(){} 
    indx(indx *ind) : inK((*ind).inK), surn((*ind).surn){} 

}; 

std::vector <indx> indexvec; 

그리고 여기에 충전 기능입니다 :

void Menu::sortIndex(){ 
    //Preparacion del fichero indices 
    for (int i = 0; i < ag.getArrSize(); i++){ 
     indexvec.emplace_back(new indx(i, ag.getPersona(i).getSurname())); 
    } 
    //Ordenacion del fichero indices 
    std::sort(indexvec.begin(), indexvec.end(), menor_surn()); 
} 

문제는 indexvec[0].surn의 벡터를 채우는 경우 indexvec[1].surn과 같습니다. 나는 ag.getPersona(0).getSurenameag.getPersona(1).getSurename이 동일하지 않다고 확인했다.

+0

[MCVE]를 제공해주세요. –

+1

또한'surn' char 포인터를 복사하는 것이 잘못되었습니다. 오히려'char *'보다는'std :: string' 데이터 타입을 사용하십시오. –

+1

메모리 누수가 발생하지 않는 것 같습니다. – MikeCAT

답변

0

솔루션

void Menu::sortIndex(){ 
    //Preparacion del fichero indices 
    for (int i = 0; i < ag.getArrSize(); i++){ 
     char *s1 = new char[strlen(ag.getPersona(i).getSurname())]; 
     strcpy(s1, ag.getPersona(i).getSurname()); 
     indexvec.emplace_back(new indx(i, s1)); 
    } 
    //Ordenacion del fichero indices 
    std::sort(indexvec.begin(), indexvec.end(), menor_surn()); 

}

이 내 실수에 대한 내 첫 번째 게시물 유감입니다.

+0

거의 옳다. 후행 null을위한 공간을 허용하려면'strlen()'에 1을 더해야합니다. – Barmar

+0

후행 null이 없습니다. –

+0

C 문자열에는 후행 null이 있어야합니다. 이것이'strcpy()'가 복사를 멈출 때를 알 수있는 방법입니다. – Barmar

관련 문제