std::string

std::string 소유권과 인코딩

std::string은 메모리를 직접 관리해 주지만 문자열의 의미까지 해결하지는 않는다. 소유, view, encoding, null 문자 포함 가능성을 구분해야 한다.

01

소유 여부 선택

저장해야 하면 string, 잠깐 읽기만 하면 string_view를 쓰되 원본 수명을 확인한다.

02

변경 비용 검토

반복 append가 예상되면 reserve로 재할당을 줄이고, substr 복사 비용을 의식한다.

03

C API 경계를 제한한다

c_str로 얻은 포인터는 string이 변경되면 무효가 될 수 있으므로 즉시 사용하는 경계에만 둔다.

string
소유하는 문자열 내용을 복사하거나 이동해 독립적인 수명을 가진다.
binary data도 담을 수 있지만 의미가 흐려질 수 있다.
string_view
비소유 관찰 복사 비용은 낮지만 원본보다 오래 살면 dangling이 된다.
반환값으로 쓸 때 특히 조심한다.
c_str
널 종료 포인터 C API에 넘기기 좋지만 내부 버퍼 수명에 묶인다.
string 변경 뒤 재사용하지 않는다.
encoding
바이트와 문자 차이 size는 바이트 수이지 사람이 보는 글자 수가 아닐 수 있다.
UTF-8 처리는 별도 정책이 필요하다.

view 수명 · 재할당 · 문자 단위 점검

view 수명 string_view가 임시 string이나 지역 string을 가리킨 채 함수 밖으로 나가지 않는가.
재할당 반복 연결에서 reserve 없이 매번 버퍼가 커지지 않는가.
문자 단위 한글 같은 멀티바이트 문자를 byte index로 자르고 있지 않은가.

소유와 관찰

std::string owned = read_line();
std::string_view prefix = owned.substr(0, 3); // owned가 살아 있어야 한다.