본문 바로가기
나/끄적

오늘의 실수: std::string

by ehei 2021. 3. 31.
std::vector<std::string> values;
auto t0 = values.emplace_back( "I would love to do but I have no money. Would you get something to drink?" ).c_str();
auto t1 = values.emplace_back( "A" ).c_str();
// 아래가 실행되면 t1의 포인터가 깨진다
auto t2 = values.emplace_back( "B" ).c_str();

C17부터 method chaining 기법이 도입되어 좀더 편리한 코딩이 가능해졌다. emplace_back()에 삽입하고 즉시 사용할 수 있게 되어 타이핑을 줄일 수 있다.

 

어쨌거나 values에 std::string 인스턴스를 담고 그것의 문자열 포인터를 사용해야할 필요가 있었다. 허나 B를 삽입하는 순간 t1의 포인터가 깨졌다. std::string이 짧은 문자열을 가질 때는 내부에 보관한다. 또한 벡터는 내부에 할당된 메모리가 모자라면, 더 크게 할당하고 메모리를 이동한다. 이 과정에서 긴 문자열을 가진 t0는 메모리가 이동되어 안전했다. 허나 짧은 문자열을 가진 t1은 복사되어 잘못된 주소를 갖게 되었다. 

 

이것의 해결책은 재할당을 할 필요가 없도록 하는 것이다

std::vector<std::string> values;
values.reserve( 4 );
auto t1 = values.emplace_back( "A" ).c_str();
auto t2 = values.emplace_back( "B" ).c_str();
auto t3 = values.emplace_back( "C" ).c_str();
auto t4 = values.emplace_back( "D" ).c_str();

' > 끄적' 카테고리의 다른 글

유치원생의 꿈  (0) 2021.05.20
210519  (0) 2021.05.19
오늘의 실수: auto  (0) 2021.03.30
210205  (0) 2021.02.05
퇴직연금의 전훈  (0) 2020.12.03