요약
예외 안정성의 요구사항
예외 안정성은 이 보장성 중 하나 보장
일반적으로 사용하는 설계 전략 : 복사 후 맞바꾸기(copy-and-swap)
어떤 객체를 수정하고 싶으면 그 객체의 사본을 만들고
원래 객체를 초기화, 원래 객체가 사본으로 수정하는 방법.
얼마전에 공부하면서 만들어본 vector에서 reserve()라는 기능을 구현할때 copy-and-swap을 써봤었다.
코드
void reserve(int capacity)
{
// 1. 원래 크기의 capacity가 더 클 경우 그냥 반환.
if (_capacity > capacity)
return;
// 2. 새로 입력받은 capacity와 기존 크기의 capacity를 교체하는 작업.
_capacity = capacity;
// 3. 기존 capacity에 있던 데이터들은 새로운 객체에 담는 과정
T* newData = new T[_capacity];
for (int i = 0; i < _size; i++)
newData[i] = _data[i];
if (_data)
delete[] _data;
// 4. 기존 _data를 비우고 _data 객체를 _newData 객체로 바꿔치기
_data = newData;
}
잊지말자!
예외 안전성을 갖춘 함수는 실행 중 예외가 발생하더라도 자원 누출X, 자료구조를 더럽히지 않음
강력한 예외 안전성 보장은 '복사-후-맞바꾸기' 방법을 써서 구현할 수 있지만, 모든 함수에 대해 강력한 보장이 있진 않음
어떤 함수가 제공하는 예외 안정성 보장의 강도는, 그 함수가 내부적으로 호출하는 함수들이 제공하는 가장 약한 보장을 넘지 않음