2010-12-08 4 views
1

내 프로그램의 다음 코드에서 funcA와 funcB의 출력이 다르기 때문에 포인터의 값이 어딘가에서 변경되었습니다. 이 오류가 마술처럼 디버거 (QT Creator 's debugger)에 나타나지 않아서 face의 주소가 변경되었다는 것을 확신 할 수 없었습니다. 그러나 여기에 코드입니다 : 내 마우스 클릭은 위의 두 가지 기능의 출력 (격렬하게 변화 위치에 따라 출력 변화가 funcB에 예 (30)에 대한 것입니다 비록C++에서 반환 된 포인터가 함수에서 반환 된 포인터가 아닌 다른 포인터를 가리키고 있습니다.

void funcA() { 
    Face *face = funcB(); 

    if (face != NULL) { 
     cout << "in funcA " << face->vertices[0] << endl; 
    } 
} 

Face * funcB() { 
    vector<Face> faces; 
    //populate faces 
    ... 

    Face *face = &(faces[index]); 
    cout << "in funcB " << face->vertices[0] << endl; 
    return face; 
} 

및 funcA 년에는 18,117,600 될 것입니다. .. 나는 단지 60 명의 얼굴을 가지고있다!) 또한 그것은 항상 무작위로 나타나기 위해 보인다.

모든 도움을 주시면 대단히 감사하겠습니다.

답변

5

우선 STL 컨테이너가있는 포인터는 위험 할 수 있습니다.

vector<Face> faces;funcB() 국부적이므로, 함수 후에 파괴되고 (회 유효한 로컬 값을 가리키는 하였다)를 함께 dangling pointer 남아 반환한다. 을 사용하여 매달린 포인터는 Undefined Behaviour을 호출합니다.

3

로컬 변수 faces[index]의 주소는 funcB이 반환 된 후에 유효하지 않은 주소로 반환됩니다. 벡터 faces의 객체는 funcB이 종료되면 삭제되고 삭제 된 객체의 주소를 반환합니다. 이렇게하면 정의되지 않은 동작이 호출됩니다.

+0

문제를 해결하는 가장 좋은 방법에 대한 제안 사항이 있으십니까? – confusedKid

+2

"문제를 해결하는 가장 좋은 방법"은 기본적으로이 기능에서 수행하는 모든 작업에 따라 다릅니다. 무엇을 성취하려고합니까? 왜 '얼굴'이 당신의 기능에서 지역적입니까? 왜 포인터를 반환하는 것이 옳은 일이라고 생각 했습니까? –

+0

faces는 광선에 의해 교차 된 지형의 모든 얼굴을 추적하는 임시 벡터로 가정되어 있으므로 나중에 어느 카메라의 얼굴이 가장 가까운 지 알 수 있습니다. 내 지형에서 faceList의 얼굴에 포인터를 반환하고 싶었 기 때문에 다른 함수에서 얼굴의 색상을 변경할 수 있습니다. – confusedKid

5

반환 한 후 더 이상 존재하지 않는 로컬 값에 대한 포인터를 반환합니다.

관련 문제