vector와 string은 기존 배열을 대신할 목적으로 설계됨
new 연산자를 써서 동적 배열을 만들 경우 고려해야 하는 사항
동적 배열을 메모리 해제해야 함
하나의 객체일 경우 delete, 배열일 경우 delete []를 사용하여 메모리를 해제해야 함
잘못 사용할 경우 미정의 동작
delete를 한 번만 호출해야 하고 두 번 이상 호출할 경우 미정의 동작
이미 해제된 메모리를 다시 해제하면 내부 데이터 구조가 손상될 수 있고, 첫 번째 delete 호출 후 해당 메모리 블록을 free 상태로 표시하고 재사용할 수 있기 때문
delete는 소멸자도 호출하는데, 이미 소멸된 객체의 소멸자를 다시 호출하면 해제된 메모리에 접근하게 되어 프로그램이 비정상 종료될 수 있음
vector와 string의 장점
위의 세 가지 부담을 없애줘서 요소가 추가되어 필요한 메모리를 할당하고, 소멸될 때 소멸자를 통해 요소를 모두 소멸시키고 메모리를 해제
시퀀스 컨테이너의 필수 사양을 완벽히 보유하여 STL의 알고리즘을 적용할 수 있음
begin/end/size 같은 멤버 함수를 지원하고, iterator/reserve_iterator 같은 반복자를 지원하고, value_type 등의 nested typedef 타입을 가짐
string은 참조 카운팅으로 동작하여 불필요한 메모리 할당과 문자 복사를 없애서 수행 성능 향상
하지만 멀티 스레드 환경에서는 참조 카운팅이 메모리 할당이나 복사에 절약된 시간을 동시성 제어에 걸리는 오버헤드가 더 걸리는 경우도 있음
1. 일반적으로 전처리자의 변수 값으로 참조 카운팅 기능을 끄는 방법
2. 참조 카운팅을 사용하지 않는 다른 string 혹은 부분만 구현
3. string 대신 vector<char> 고려
string은 basic_string<char>의 typedef 타입이고, wstring은 basic_string<w_char>의 typedef 타입
'C++ > Effective STL' 카테고리의 다른 글
Effective STL 항목 15 잊지 말자! string은 여러 가지 방식으로 구현되어 있다는 사실을 (0) | 2024.12.29 |
---|---|
Effective STL 항목 14 reserve는 필요 없이 메모리가 재할당되는 것을 막아 준다 (0) | 2024.12.27 |
Effective STL 항목 12 STL 컨테이너의 스레드 안전성에 대한 기대는 현실에 맞추어 가지자 (0) | 2024.12.23 |
Effective STL 항목 11 커스텀 할당자를 제대로 사용하는 방법을 이해하자 (0) | 2024.12.22 |
Effective STL 항목 10 할당자의 일반적인 사항과 제약 사항에 대해 잘 알아두자 (1) | 2024.12.20 |