내가이 코드를 작성할 때 : 내가 포인터를 만드는 오전 때이해 포인터 C++
Animal *p;
Animal b;
p = &b;
첫 번째 줄에 있습니다. Animal의 새 객체가 만들어 지나요? 아니면 두 번째 줄을 쓸 때만입니까?
감사합니다.
내가이 코드를 작성할 때 : 내가 포인터를 만드는 오전 때이해 포인터 C++
Animal *p;
Animal b;
p = &b;
첫 번째 줄에 있습니다. Animal의 새 객체가 만들어 지나요? 아니면 두 번째 줄을 쓸 때만입니까?
감사합니다.
첫 번째 행에서는 포인터가 만들어 지지만 아직 아무 것도 가리 키지 않습니다. 두 번째 줄에서는 실제 Animal
개체를 만듭니다.
Animal *p;
은 포인터를 만들고 Animal b;
은 동물을 만듭니다.
새 개체는 해당 메서드가 만들어 질 때 스택에 만들어지며 메서드가 반환 될 때 사라집니다. 메서드에서 값을 반환하고 스택 메모리가 메서드에서 반환되는 부분으로 할당 취소 될 것이므로 사용하려고하면 응용 프로그램이 중단됩니다.
그래도 언어가 충돌을 보장하는 것은 아닙니다. 수명이 끝난 후 객체에 액세스하려고하면 충돌을 비롯한 이상한 결과가 발생할 수도 있고 그렇지 않을 수도있는 * 정의되지 않은 동작 *이 발생합니다. – fredoverflow
사실, 모든 실제적인 목적을 위해 크래시를 기대할 수 있습니다. 이것이 가능한 기술이라고 주장하는 것조차도 그의 수준에서 프로그래머에게는 가치가 없다. –
이것은 op 질문에 실제로 응답하지 않지만 인스턴스 변수에 대한 포인터가 있으면 포인터에 대한 유효 지점이므로 범위 문제가 발생할 수 있습니다. – AJG85
포인터를 선언하고 선언이 정의 인 경우 포인터에 대한 공간 만 할당되며 Animal
개체가 생성되지 않습니다.
포인터를 초기화하지 않으면 유효한 Animal
개체를 가리 키거나 포인터가 가리 키지 않는 특수한 "널 포인터 값"을 지정하는 것 이외에는 포인터를 초기화 할 수 없습니다 유효한 개체에서. 실제로 유효한 Animal
개체를 가리키고 있는지 테스트 할 수도 없습니다.
이 null 또는 당신이 그들을 만들 자마자 유효한 객체로하는 중 포인터를 초기화하는 것이 좋습니다, 그래서 나도 추천 :
Animal* p = 0; // or = NULL
Animal u;
p = &u;
이상 :
Animal u;
Animal* p = &u;
// 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
은 여전히 해당 메모리 위치를 가리 킵니다. 그것에 접근하려고하면, 나쁜 일들이 일어날 수 있습니다.
두 번째 줄을 쓸 때만. –