2012-03-22 6 views
1

인스턴스에서 함수를 호출하는 다음 두 가지 방법간에 차이가 있습니까? 어떤게 더 좋아?포인터를 사용 하시겠습니까?

Motor M; 
    M.moveToPosition(Speed, TargetPosition); 

    Motor *M; 
    M->moveToPosition(Speed, TargetPosition); 

고마워요!

+5

두 번째 해 보셨습니까?! 초기화되지 않은 포인터를 참조 해제하는 것은 UB이고 이것이 문제없이 실행되면 놀랄 것입니다. –

+0

어떻게 든 컴파일됩니다 –

+0

@ Maran Dessouki 실제로 컴파일되지만 예상대로 실행되지 않습니다. –

답변

4

포인터가 초기화되지 않았기 때문에 두 번째 버전의 포인터는 Undefined Behavior입니다!

당신은 동적 타입 Motor의 객체를 할당 할 수 있습니다 (즉 힙에 할당) :

Motor *M = new Motor; 
M->moveToPosition(Speed, TargetPosition); 
... 
delete M; 

Smart Pointers 당신이 피하는 데 도움이됩니다 힙에 할당 된 개체를 삭제하는 것을 기억해야합니다.

어느 쪽이 더 나은지에 관해서는, 나는 두려운 것이 문맥에 달려 있다고 생각합니다. 일반적으로 C++에서는 자동 객체 (스택에 있음)를 역동적 인 객체 (힙에 있음)보다 선호하는 경우가 있습니다.

+2

스마트 포인터 (std :: unique_ptr)를 통해 M을 가리키는 것이 더 낫습니다. –

+0

@MarcinHoppe : 당신이 코멘트하는 동안 그 조각 (그리고 그 이상)을 추가하는 중이었습니다 :) –

2

첫 번째 방법은 Motor 생성자를 호출합니다. 두 번째 방법은하지 않으며 포인터는 초기화되지 않습니다.

C++에서는 가능하면 포인터를 사용하지 마십시오. 여기에서 첫 번째 방법을 사용하십시오. 동적으로 모터를 할당 할 경우

, 이것을 사용 :

std::unique_ptr<Motor> M(new Motor); 
M->moveToPosition(...); 
0

을 그것은 동일하지만 포인터를 사용하여 동적으로 (즉, 루프에서) 개체를 만들고 파괴 할 수있을 것,에 대한 작업을 수행 임의의 수의 객체, 다형성 등을 활용할 수 있습니다.

+0

... 매우 신중하지 않다면 정말 멋진 메모리 누출을 얻으십시오! :) – hochl

+0

"위대한 힘으로 ..." – Alexander

+0

".. 위대한 메모리 누수가 올까?" ^^ – hochl

관련 문제