2011-01-06 5 views
0

내가이 코드를 작성할 때 : 내가 포인터를 만드는 오전 때이해 포인터 C++

Animal *p; 
Animal b; 
p = &b; 

첫 번째 줄에 있습니다. Animal의 새 객체가 만들어 지나요? 아니면 두 번째 줄을 쓸 때만입니까?

감사합니다.

+0

두 번째 줄을 쓸 때만. –

답변

5

첫 번째 행에서는 포인터가 만들어 지지만 아직 아무 것도 가리 키지 않습니다. 두 번째 줄에서는 실제 Animal 개체를 만듭니다.

+0

그리고 만약 내가 파이어를 개인용으로 만들고 함수 내부에서 실제 객체를 만들고 그것을 포인터에 집어 넣으면 함수를 종료 할 때 새로운 객체가 종료 될까? – adir

+1

@adir 예 소멸자가 범위를 벗어나 포인터가 유효하지 않게되면 소멸자가 호출됩니다. 그들은 포인터라고 부릅니다. 왜냐하면 메모리에있는 위치를 가리키고 있기 때문에 new 연산자를 사용하여 힙에 할당 한 unle 인스턴스를 삭제해야합니다. 그렇지 않으면 메모리 누수가 발생합니다! – AJG85

4

Animal *p;은 포인터를 만들고 Animal b;은 동물을 만듭니다.

1

새 개체는 해당 메서드가 만들어 질 때 스택에 만들어지며 메서드가 반환 될 때 사라집니다. 메서드에서 값을 반환하고 스택 메모리가 메서드에서 반환되는 부분으로 할당 취소 될 것이므로 사용하려고하면 응용 프로그램이 중단됩니다.

+0

그래도 언어가 충돌을 보장하는 것은 아닙니다. 수명이 끝난 후 객체에 액세스하려고하면 충돌을 비롯한 이상한 결과가 발생할 수도 있고 그렇지 않을 수도있는 * 정의되지 않은 동작 *이 발생합니다. – fredoverflow

+0

사실, 모든 실제적인 목적을 위해 크래시를 기대할 수 있습니다. 이것이 가능한 기술이라고 주장하는 것조차도 그의 수준에서 프로그래머에게는 가치가 없다. –

+0

이것은 op 질문에 실제로 응답하지 않지만 인스턴스 변수에 대한 포인터가 있으면 포인터에 대한 유효 지점이므로 범위 문제가 발생할 수 있습니다. – AJG85

9

포인터를 선언하고 선언이 정의 인 경우 포인터에 대한 공간 만 할당되며 Animal 개체가 생성되지 않습니다.

포인터를 초기화하지 않으면 유효한 Animal 개체를 가리 키거나 포인터가 가리 키지 않는 특수한 "널 포인터 값"을 지정하는 것 이외에는 포인터를 초기화 할 수 없습니다 유효한 개체에서. 실제로 유효한 Animal 개체를 가리키고 있는지 테스트 할 수도 없습니다.

이 null 또는 당신이 그들을 만들 자마자 유효한 객체로하는 중 포인터를 초기화하는 것이 좋습니다, 그래서 나도 추천 :

Animal* p = 0; // or = NULL 
Animal u; 
p = &u; 

이상 :

Animal u; 
Animal* p = &u; 
0
// create a pointer to an animal object and initialize it to NULL 
//Animal* p; // Bad! Do not do this 
Animal* pA = NULL; // Much better 

Animal a; // creates an Animal object on the stack (local scope) 

Animal pA = &a; // sets pA to point to the location of a 

a이 범위를 벗어나면 pA은 여전히 ​​해당 메모리 위치를 가리 킵니다. 그것에 접근하려고하면, 나쁜 일들이 일어날 수 있습니다.