2017-12-06 12 views
1

이 오류에 대한 여러 게시물을 보았지만 해결 방법을 찾지 못했습니다. 내 코드에는 "유전자"의 벡터가 있고 각 유전자는 int 형식의 소스와 대상을 포함합니다.C++ 런타임 오류 : 무료() : 다음 크기가 잘못됨 (빠름)

유전자 벡터에서 소스와 대상의 가능한 모든 값을 모두 포함하는 int 벡터를 만들고 싶습니다. 먼저 각 유전자를 살펴보고 소스와 대상을 확인한 다음 해당 ID가 이미 벡터에 존재하는지 확인합니다. 만약 그렇다면 그것을 무시하고 새로운 값을 벡터에 추가하십시오.

void addMutations(vector<Gene*>* genome){ 
    vector<int> nodeIDs; 

    for(int i = 0; i < genome->size(); i++){ 
     int src = genome->at(i)->sourceNeuronID; 
     int dst = genome->at(i)->destinationNeuronID; 

     if(find(nodeIDs.begin(), nodeIDs.end(), src) == nodeIDs.end()){ 
      nodeIDs.push_back(src);// <-- Issue is here 
     } 

     if(find(nodeIDs.begin(), nodeIDs.end(), dst) == nodeIDs.end()){ 
      nodeIDs.push_back(dst);// <-- Probably here too 
     } 
} 

이 문제는 srcdstfor 루프의 반복의 끝에서 범위를 벗어난 이동한다는 사실에서 나오나요?

+0

"문제"는 ... 무엇일까요? 제목의 오류 메시지? 나는 int의 벡터에'push_back '이 어떤 식 으로든'free()'이 없기 때문에) 오류를 줄 수있는 방법을 보지 못했다. – DevSolar

+2

일반적으로 할당 된 메모리 범위를 쓸 때 발생합니다. 내 제안은 당신이 포인터를 너무 많이 사용하지 않는다는 것이다. 벡터에 포인터를 전달하는 대신 참조를 전달하십시오. 그리고 포인터 벡터를 사용하는 대신 인스턴스의 벡터를 사용하십시오 (사용하지 않는 다형성에 대한 포인터가 필요하지 않은 경우). 또한 노드 ID에 대한 벡터 대신 [std :: unordered_set'] (http://en.cppreference.com/w/cpp/container/unordered_set)를 사용할 수 있습니다. –

+0

당신의 질문에 [MCVE] –

답변

1

Does the issue come from the fact that src and dst go out of scope at the end of iteration of the for loop?

아니요,이 값은 범위를 벗어나기 전에 벡터로 푸시됩니다. 따라서 괜찮습니다.

C++ Runtime Error: free(): invalid next size (fast)

즉, 힙이 손상되었음을 의미합니다. Valgrind는이 경우 도움이 될 수 있습니다.

메모리 오류는 std::vector에서 나오지 않지만 포인터에서 나온 것입니다. 어딘가에, 너는해서는 안되는 것을 풀어? 이는 사용자를 대신하여 나쁜 메모리 할당으로 인해 발생할 수 있습니다. 원하는대로 할당되지 않았습니다. 게시 한 코드를 누가 알 수 있습니까?

어떤 경우에는 을 사용하면 실제로 Valgrind를 사용하여 오류를 추적해야합니다.


추신 : 정말 많은 포인터를 사용해야합니까? 그래서

genome.at(i)->sourceNeuronID; 

과 :

void addMutations(vector<Gene*>& genome) { 

을 다음과 같이하십시오 나는 당신의 기능에 의미, 당신은 다음과 같이 참조하여 벡터를 통과 할 수 있었다.

포인터는 위대함 (예 : 다형성)하지만 조심해서 사용해야하며 당연히 필요할 때 사용하십시오 (팬 메 트론 아리스 톤).

+1

입력 해 주셔서 감사합니다.더 많은 의미가 있기 때문에 지금 참조로 통과하도록 기능을 변경했습니다. 정말 재미있는 점은 코드의이 시점에서 아무 것도 무료가 아니며 모든 Gene 객체가 잘 정의되어 있다는 것입니다. 나는 Valgrind를 조사 할 것이다. 고맙습니다! – MagnusCaligo

+1

그런 다음 할당이 @MagnusCaligo에 잘못되었습니다. 당신이 필요로하는 것보다 적게 할당 한 exaple을 위해, 또는 포인터에 메모리를 적절하게 할당하지 않았습니다 ... 또는 당신은 매달려있는 포인터를 가지고 있습니다, 또는 .... 그것은 긴 목록입니다! ;) 도움이된다면 * 내 대답을 수락하는 것을 잊지 마십시오. 행운을 빈다. – gsamaras

+1

나는 그것을 이해했다. 내 코드에서 malloc으로 충분한 공간을 할당하지 못했습니다. 앞으로 다른 사람이 도움이되기를 바랍니다. Valgrind를 처음 15 분 안에 사용하면 문제가 발견되어 매우 좋습니다. – MagnusCaligo