Pointer

포인터는 주소를 담지만 의미는 소유와 관찰로 나뉜다

포인터 기초에서 가장 중요한 질문은 *와 & 문법보다 이 주소가 유효한 객체를 가리키는지, 그리고 해제 책임이 누구에게 있는지다.

01

널 가능성 표시

없을 수 있는 값이면 pointer, 반드시 있어야 하면 reference가 더 정확할 때가 많다.

02

수명 확인

지역 변수 주소를 함수 밖으로 넘기면 해당 변수 수명이 끝난 뒤 dangling pointer가 된다.

03

소유권 타입 선택

해제 책임이 있다면 unique_ptr이나 shared_ptr로 바꾸어 코드에 정책을 드러낸다.

T*
nullable 관찰 객체가 없을 수 있고, 접근 전 null 검사가 필요하다.
delete 책임을 암시하지 않는다.
&obj
주소 얻기 객체가 살아 있는 동안만 의미가 있다.
임시 객체 주소는 조심한다.
*ptr
역참조 null, dangling, 잘못된 타입이면 즉시 위험해진다.
검사 뒤 가까운 곳에서 사용한다.
ptr++
포인터 산술 배열 같은 연속 객체 범위 안에서만 안전하다.
범위 끝을 넘겨 역참조하지 않는다.

널 검사 · 수명 · 소유권 점검

널 검사 없을 수 있는 포인터를 역참조하기 전에 검사하는가.
수명 가리키는 객체가 포인터보다 오래 살아 있는가.
소유권 delete해야 하는 포인터라면 스마트 포인터가 더 적절하지 않은가.

관찰 포인터

void draw(const Widget* widget) {
    if (!widget) return;
    widget->render();
        overflow-wrap: break-word;
        word-break: keep-all;
      }