2016-10-24 4 views
0

포인터에 해당하는 클래스에 데이터 멤버가 있습니다. 또한 동적 배열의 목적으로이 포인터를 동적으로 할당하는 setter 함수가 있습니다. 새 값을 설정하기 전에 메모리 누수를 피하기 위해이 포인터를 삭제해야합니다. 이 포인터가 초기화되어 있는지 확인하여 초기화되지 않은 경우 새 값을 설정하기 전에 포인터의 메모리를 삭제할 필요가 없습니다.C++ 클래스의 데이터 멤버 인 포인터가 초기화되었는지 어떻게 확인합니까?

+3

이 사용되지 않거나 정상적인 일을 할 때'nullptr'을 설정하고'unique_ptr'을 사용하여 수명을 처리하십시오. 덧붙여 말하자면,'nullptr'에'delete'를 호출하면 어쨌든 아무것도하지 않습니다. – jaggedSpire

+0

회원에 대한 기본값을 'nullptr'로 설정한다는 의미입니까? 이것이 C++에서 어떻게 이루어 졌는지 궁금합니다. @ jaggedSpire – Nicholas

+1

예. 클래스 초기화, 멤버 초기 설정자 목록 또는 생성자 몸체에서'nullptr'으로 설정하십시오. – jaggedSpire

답변

4

두 가지 옵션이 있습니다. 먼저 모든 것을 손으로 처리하고 생성자에서 nullptr으로 설정할 수 있습니다. 그런 다음 새 메모리를 할당하기 전에 nullptr인지 확인하고 그렇지 않은 경우 삭제하십시오. 대신 스마트 포인터 (예 : std::unique_ptr)를 사용하는 것이 좋습니다. 새 포인터로 설정해야 할 때마다 reset을 호출 할 수 있으며 메모리 누수에 대해 걱정할 필요가 없습니다. 이전에 할당 된 메모리가 있으면 삭제해야합니다.

+0

첫 번째 시나리오에서는 삭제하기 전에 NULL을 확인하지 않아도됩니다. 'delete'는 널 포인터를 적절히 처리합니다. –

+0

@PeteBecker 1. 아직도'nullptr'을 설정해야하지만'delete' 전에 무효를 검사 할 필요가 없다는 것을 의미합니까? 2. 내 포인터는 앞으로 동적 배열이 될 수 있습니다.'delete [] a_pointer;도'nullptr'에서 제대로 작동합니까? – Nicholas

+0

@grigor'std :: unique_ptr'는 훌륭하게 들리지만,이 마법 (std :: unique_ptr)을 사용하기위한 성능 비용 (속도가 느려짐을 의미)이 있는지 궁금하십니까? – Nicholas