2012-01-21 1 views
2

mingw 컴파일러를 사용하여 Windows에서 CodeBlocks의 다음 C++ 코드를 실행할 때 모두 정상입니다. Xcode에서 포인터를 전달하는 중 오류가 발생하지만 Windows의 Codeblock에서 작동합니다.

1 
1 

그러나 Mac에서

, 나는

를 얻을 수있다

void func (vector<int> &v1, vector<vector< int *> > &v2); 

int main() 
{ 
    vector<int> v1; 
    v1.push_back(0); 
    vector<vector <int *> > v2; 
    vector<int *> vTemp; 
    int x = 0; 
    int * ptr = &x; 
    vTemp.push_back(ptr); 
    v2.push_back(vTemp); 

    func(v1,v2); 
    cout<<*(v2[0][1])<<endl; 

    return 0; 
} 
void func (vector<int> &v1, vector<vector< int *> > &v2) 
{ 
    v1.push_back(1); 
    int *ptr = &(v1[1]); 
    v2[0].push_back(ptr); 
    cout<<*(v2[0][1])<<endl; 
    v1.push_back(2); 
    int *ptr2 = &(v1[2]); 
    v2[0].push_back(ptr2); 
    v1.push_back(3); 
    int *ptr3 = &(v1[3]); 
    v2[0].push_back(ptr3); 
} 

내가 기대하는 출력을 (그리고 Windows에서 얻을 수) : 그러나, 나는 맥 OS X에서 실행하면 작동하지 않습니다

1 
0 

왜 이런 일이 일어나는 지 아는 사람이 있습니까?

답변

3

프로그램이 잘못되었습니다. 정의되지 않은 동작이 표시됩니다. 포인터 값은 vector 크기가 조정 된 후 유효하지 않을 수있는 벡터 요소의 주소를 보유합니다.

GuardMalloc을 사용하여 프로그램을 실행하면이 문제가 발생합니다.

+1

이 프로그램을 확장하려면'int * ptr = & (v1 [1])'을 실행하고'v1.push_back (2)'를 실행하면됩니다. 'push_back'은 벡터의 용량을 증가시킬 필요가있는 경우 벡터 요소를 가리키는 모든 포인터를 무효화 할 수 있습니다. 'v1'을 생성 한 후에'main'에'v1.reserve (4);'행을 추가하면 용량이 충분 해지며 예상 답변을 얻을 수 있습니다. 물론 너무 약해서 이런 식으로 포인터를 저장하는 것은 여전히 ​​나쁜 생각입니다. – bames53

+0

@ bames53 +1 좋은 확장 – justin

+0

답장을 보내 주셔서 감사합니다. 정의되지 않은 동작이 있어야한다고 생각했지만 어디에서 왔는지 알 수 없었습니다. 그래서 벡터의 객체에 대한 포인터는 나쁜 생각입니다. 맞습니까? – Edlennion