std::string 계약

std::string 수명 관리

std::string은 C 스타일 문자열보다 안전하지만 모든 문자열 문제를 자동으로 해결하지는 않는다. 내부 버퍼 소유권, c_str 포인터 수명, string_view dangling, UTF-8 문자 길이, append 중 재할당을 함께 이해해야 한다.

01

소유 타입 선택

문자열을 저장하고 바꿔야 하면 string, 잠깐 읽기만 하면 string_view를 검토한다.

view는 소유하지 않는다
02

C API 연결

c_str로 넘긴 포인터가 string 수정 후에도 유효한지 확인한다.

재할당이 포인터를 무효화할 수 있다
03

수정 비용 확인

반복 append, substr, find가 복사와 할당을 얼마나 만드는지 본다.

reserve가 필요한 경우가 있다
04

인코딩 구분

std::string은 byte sequence이며 UTF-8 글자 수와 size는 다를 수 있다.

한글 한 글자는 여러 byte다
05

뷰 수명 검증

임시 string에서 만든 string_view가 원본보다 오래 남지 않는지 확인한다.

dangling view는 흔한 함정이다
std::string
소유 문자열 버퍼를 직접 소유하고 수정, 복사, 이동할 수 있다.
복사 비용과 재할당을 고려한다
const char*
C 문자열 인터페이스 null 종료 관례를 쓰는 API와 연결할 때 필요하다.
수명은 호출자가 보장해야 한다
string_view
비소유 읽기 view 복사 없이 문자열 구간을 읽지만 원본 수명이 더 길어야 한다.
임시 객체에서 만들면 위험하다
UTF-8
byte와 문자 차이 size는 byte 수이며 사용자 기준 글자 수와 다르다.
문자 단위 처리는 별도 라이브러리를 검토한다

문자열 확인

포인터 수명 c_str 포인터를 저장한 뒤 string을 수정하지 않는지 확인한다.
view 원본 string_view가 참조하는 원본이 view보다 오래 살아 있는지 본다.
글자 수 UTF-8 문자열에서 byte length와 사용자 글자 수를 혼동하지 않는지 확인한다.