이 질문에 대한 답변을 보내 주셔서 감사합니다. :)
나는 소멸자와 그 finally
개념이 다르다고 말하려고했습니다 .
- 소멸자는 자원을 방출하기위한 것입니다 ( data )
finally
발신자에게 반환하기위한 것입니다 ( control )
이 가상의 의사 코드를 생각해보십시오.
try {
bar();
} finally {
logfile.print("bar has exited...");
}
finally
여기서는 자원 관리 문제가 아닌 제어 문제를 완전히 해결하고 있습니다.
소멸자에서 여러 가지 이유로 그렇게하는 것은 합리적이지 않습니다.
- 어떤 것은 "인수 없습니다"또는 "창조"되고
- 로그 파일에 인쇄하지 않으면됩니다 하지 자원 유출, 데이터 손상 등 (여기에 로그 파일이 다른 프로그램에 다시 공급되지 않는다는 것을 가정) 결과
logfile.print
실패 는 합법적 이지만 파괴는 개념적으로 실패 할 수 없습니다
이번에는 Javascript와 같은 또 다른 예가 있습니다.
var mo_document = document, mo;
function observe(mutations) {
mo.disconnect(); // stop observing changes to prevent re-entrance
try {
/* modify stuff */
} finally {
mo.observe(mo_document); // continue observing (conceptually, this can fail)
}
}
mo = new MutationObserver(observe);
return observe();
위의 예에서는 다시 해제 할 리소스가 없습니다.
사실, finally
블록입니다 획득 목표, 잠재적으로 실패 할 수 있습니다 달성하기 위해 내부 자원을. 따라서 소멸자를 사용하는 것은 이치에 맞지 않습니다 (자바 스크립트가있는 경우).
반면에이 예에서는
b = get_data();
try {
a.write(b);
} finally {
free(b);
}
finally
자원을 파괴하고 있습니다 b
. 데이터 문제입니다. 문제는 컨트롤을 호출자에게 깨끗하게 되 돌리는 것이 아니라 리소스 누수를 피하는 것입니다.
실패는 선택 사항이 아니며 (개념적으로) 절대 발생하지 않아야합니다.
모든 릴리스 b
는 반드시 인수와 쌍을 이루며 RAII를 사용하는 것이 좋습니다.
다시 말해, 둘 다 동일한 문제를 의미하지 않거나 두 문제 모두에 적합한 솔루션이라는 것을 시뮬레이션하는 데 사용할 수 있기 때문입니다.