2013-07-18 4 views
1
#include <unordered_set> 

class C { 
public: 
    std::unordered_set<int> us; 
}; 

int main() { 
    C* c; 
    c->us.insert(2); // Segmentation Fault 
} 

내가 뭘 잘못하고 있니?세그먼트 화되지 않은 객체를 가리키는 포인터가있는 오류

객체로 선언 된 객체는 달리
C* c = new C; // <<== Add this 
c->us.insert(2); 
delete c; // <<== Free the memory 

하지 포인터를 초기화 할 필요가 (C c;는 예) 포인터가로 : 당신이 그들에게 할당해야 하나 주소를 포인터가 할당되지 않았기 때문에

+0

'c'객체에 menorory가 할당되지 않았습니다. –

+0

와우. 그건 내 바보 같았 어. 한동안 C++을 사용하지 않았습니까? = P – anthropomorphic

답변

4

당신은 세그먼트 오류를 ​​얻을 수 기존 개체의 새 개체에 메모리를 할당하거나 new 연산자를 사용하여 메모리를 할당 할 수 있습니다. 초기화되지 않은 포인터를 역 참조하는 것은 정의되지 않은 동작으로 간주되어 종종 세그먼트 화 오류를 일으 킵니다.

+0

아니면 더 나은, 전혀 "새로운"C를 만들지 말아라, 너는 필요 없어. 그냥'C c; c.us.insert (2);' – IdeaHat

+0

질문의 코드는 내가 작성한 실제 코드가 아닙니다. 그것은 여전히 ​​문제를 일으키는 가장 단순한 형태의 문제였습니다. 실제 코드 인'c' (실제로 "c"로 명명되지는 않음)는 포인터 여야합니다. – anthropomorphic