예외 안정성이 확보되는 그날 위해 싸우고 또 싸우자!

Bogoomi·2022년 6월 24일
0

EffectiveC++

목록 보기
13/24

항목29 - 예외 안정성이 확보되는 그날 위해 싸우고 또 싸우자!

요약
예외 안정성의 요구사항

  • 자원이 새도록 만들지 않는다.
  • 자료구조가 더렵혀지는 것을 허용하지 않는다.(함수에서 메모리상에 없는 함수를 호출한다던가, 정상적 작동범주를 넘어선 경우)

예외 안정성은 이 보장성 중 하나 보장

  • 기본적인 보장
    예외 발생 시, 자원 누수를 시키지 않겠다. but, 프로그램의 상태는 예측 불가.
  • 강력한 보장
    성공 아니면 호출 전 상황으로 호출상태로.(이런 함수를 호출하는 것을 atomic 동작이라함).
  • 예외불가 보장
    예외를 절대로 안던지겠다는 보장.

일반적으로 사용하는 설계 전략 : 복사 후 맞바꾸기(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, 자료구조를 더럽히지 않음
강력한 예외 안전성 보장은 '복사-후-맞바꾸기' 방법을 써서 구현할 수 있지만, 모든 함수에 대해 강력한 보장이 있진 않음
어떤 함수가 제공하는 예외 안정성 보장의 강도는, 그 함수가 내부적으로 호출하는 함수들이 제공하는 가장 약한 보장을 넘지 않음

profile
개에에에바알

0개의 댓글