2010-01-14 6 views
0

불행히도, 나 자신이 완전히 개발 한 프로그램에서 작업하지 않습니다. 최근에 unordered_set에 대한 포인터를 간단히 삽입 한 unordered_set의 operator--에 Visual Studio Fatal Error가 나타났습니다. 지역 주민들을 살펴본 결과, 세트에는 마지막에 NULL이있는 요소가 2 개 밖에 없다는 것을 알았습니다 (그래서 추락 한 것 같습니다). 이제 질문 : 어떻게 (이론적으로) unordered_set (또는 다른 STL 컨테이너) 요소 중 하나로 NULL 포인터를 얻을 수 있습니다. 프로그램은 멀티 스레드이지만, 내 리뷰에 따르면 코드의 일부는 한 스레드에서만 액세스해야합니다. 감사.C++ STL 컨테이너의 NULL 포인터

콜 스택과 관심이있는 사람들을위한 소스 코드의 일부 : http://privatepaste.com/c8e7f35a4e 을 (PushToProcessed가 오브젝트 자체에서 호출은, 그 자체에 대한 참조를 전달하므로 NULL 일 수 없습니다)

+1

일부 코드는 좋을 것입니다. – notnoop

+3

오른쪽, 정렬되지 않은 세트 ? – bmargulies

+1

코드를 게시해야 할 수도 있습니다. –

답변

4

는 NULL이 완벽하게 유효한 포인터 값입니다 . NULL이 전달되면 모든 메모리 주소와 마찬가지로 처리됩니다. 2 개의 엔트리 만보고 있기 때문에 실제로보고있는 것이 많은 NULL 포인터가 세트에 "추가"되고 있다고 추측 하겠지만, 하나의 세트 만 유지되므로 세트가됩니다.

편집 : 진술서를 법원에 간단한 전화에 넣지 왜

이 많은 항목의 내 가설을 테스트하려면이 NULL 값을 모두 추가되는 포인터의 값을 "새 항목은 = 주소 추가". 놀랄거야.

+0

거기에 NULL 포인터를 추가 할 수없는 경우에는 다음을 수행 할 수 없습니다. o – Stranger

+0

코드가 없으면 NULL을 허용하는 원시 포인터 컨테이너가 있다는 가정 만 할 수 있습니다. – wheaties

+0

추가 할 수 없습니까? 컨테이너 '삽입 (0)'을 할 수 없다는 뜻입니까? – GManNickG

6

집합은 NULL 일 수있는 포인터를 포함 할 수 있습니다.

#include <iostream> 
#include <vector> 

int main() { 
    std::vector<int *> foo; 
    foo.push_back (NULL); 
    std::cout << foo.size() << std::endl; 
    return 0; 
} 

컨테이너에는 쉽게 NULL 값이 포함될 수 있습니다. 컨테이너의 내부가 엉망이됐다고 말하는거야?

1

컨테이너 포인터 값은 (* iter) = NULL처럼 역 참조 된 비 const 반복기를 통해 설정할 수 있다고 생각합니다. 물론 입니다.