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 타입

 

 

+ Recent posts

목차