2012-10-07 3 views
1

위해 나는 vector<int> *F[12];를 벡터에 대한 포인터의 배열을 가지고 있고 어떤 벡터를 초기화하고 나중에에 액세스하려고 할 때선언 벡터 내부 루프

for(uint i = A; i <= B; ++i){ 
    vector<uint> newvec(pow2(i), 0); 
    F[i] = &newvec; 
} 

는하지만, 내가 찾을 F. 자신의 주소를 저장하고자 그들은 모두 0이 아닙니다 :

for(uint i = A; i <= B; ++i){ 
    for(uint j = 0; j <= pow2(i); ++j){ 
     if((*F[i]).at(j) != 0){ 
      cout << i << "/" << j << "/" << (*F[i]).at(j) << "|"; 
     } 
    } 
} 

이것은 선언 된 벡터의 범위와 관련이 있다고 가정합니다. 왜 메모리가 해제 되었습니까? malloc을 사용하고 그로부터 벡터를 만들어야합니까?

+1

http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris

답변

2

호출 스택마다 newvec가 만들어집니다. 매번 루프를 통해 포인터를 만들고 포인터를 만들면 사라집니다. 'new'연산자를 사용하여 힙에 벡터의 오래 지속되는 인스턴스를 만들려고합니다.

+0

'벡터 * = newvec 새로운 벡터 (pow2 (I) 0); F [i] = newvec; '고맙다 고 생각합니다. – Arcinde

+0

@ user49164 : 여기에 벡터를 동적으로 할당 할 이유가 없습니다. 'std :: vector'와 같은 컨테이너를 사용하면 얻을 수있는 이점 중 하나는 메모리를 관리한다는 것입니다. 동적으로 할당 할 때 할당을 해제해야합니다. 함수에 대한 인수로'vector &'를 이야기하고 그것을 채우거나'vector'를 반환하는 것이 가장 좋습니다. –

2

newvec은 루프가 종료 될 때 범위를 벗어납니다. 그 시점에서 기존 참조 또는 포인터가 유효하지 않습니다. 적절한 범위에서 객체를 선언해야합니다 (이 경우 사용자에게 무엇이 필요한지 모르지만 실제로는 for 루프 외부).