2015-01-26 4 views
0

함수에 아무 곳이나 pointerToObj = NULL이 없더라도 개체에 대한 포인터가 NULL로 설정됩니다. 나중에 포인터를 사용하여 액세스 위반 예외를 발생시킵니다. 또한 테스트 포인터를 추가하여 값을 보존할지 여부를 확인했지만 아니요 - 동시에 NULL로 설정됩니다.구조체가 커질 때 벡터의 요소를 가리키는 포인터가 NULL로 설정됩니다.

포인터는 벡터의 객체를 가리 킵니다. 한 시점에서 벡터에 새 객체를 추가하므로 구조가 커집니다. 바로 다음에 포인터가 NULL로 설정됩니다. 나는 이것을 테스트했다. 모든 포인터는 벡터의 특정 요소를 가르키고 새로운 객체를 추가 한 직후에 NULL로 설정된다.

나는 벡터가 작동하는 방식 때문에 이런 일이 일어난다 고 생각합니다. 실수가 아니라면 스택을 기반으로합니다. 스택이 길어지면 더 큰 새로운 배열로 자신을 복사하고 이전 스택을 삭제해야합니다. 그러나 이제 새 배열은 메모리의 다른 위치에 있으므로 포인터가 더 이상 올바른 위치를 가리키고 있지 않습니다.

정말입니까?

+0

'std :: vector'는 설명대로 작동하지 않습니다. 외부 포인터가 NULL로 설정되는 것입니다. 이 동작의 코드를 게시해야합니다. –

+1

포인터가 사실 NULL로 설정되었는지 확인 했습니까? ** 어떻게? ** (최소 코드 예제?) 널 포인터를 역 참조하는 동안 액세스 위반이 발생하지만 (Windows에서는) 그 반대가 사실이 아닙니다. 액세스 위반은 널 포인터가 아닌 모든 유효하지 않은 포인터에서 발생합니다. – MSalters

답변

2

예, std::vector에 요소를 추가하면 설명하는 이유로 요소에 대한 포인터가 무효화 될 수 있습니다 (그러나 스택과는 아무런 관련이 없음). 귀하의 포인터가 마법처럼 null로 설정되지 않습니다, 그것은 단지 존재하지 않는 개체를 가리 킵니다.

+0

추가 : 해결책은 '벡터'에 객체에 대한 포인터를 저장하면 안된다는 것입니다. 대신 개체의 인덱스를 저장하거나 포인터를 유지하는 컨테이너를 사용하십시오. –

+0

그래, NULL 포인터와 무효화 된 포인터를 혼동했다. 내가 벡터가 어떻게 작동하는지 오해 한 것 같습니다. – AlexSavAlexandrov

관련 문제