2012-09-27 4 views
3

내가 iOS에서 독점적 인 목표 - C의 몇 년 후, 최근에 내 C++에 따라 잡고, 그리고 '새로운 스타일'에 가장 온다 주제 한은 C++ 내가 RAII 개념을 이해하고 있는지 확인하기 위해 RAII게으른로드가 RAII의 예라고 간주 될 수 있습니까?

입니다 정확하게 Objective-C 지연로드 속성 접근자를 RAII 유형으로 간주 하시겠습니까? 예를 들어, 다음 액세스 방법을 확인하십시오.

- (NSArray *)items { 
    if(_items==nil) { 
     _items=[[NSArray alloc] initWithCapacity:10]; 
    } 
    return _items 
} 

이것이 RAII의 예라고 생각 되나요? 그렇지 않다면 내가 착각 한 곳을 설명해 주시겠습니까?

+0

왜 게으른로드가 RAII의 요소가 될 것이라고 생각하십니까? – tenfour

+0

내가 분명히 RAII를 너무 잘 이해하지 못하기 때문에 나는 추측하고있다 :) – codemonkey

+1

그것은 전적으로 합법적 인 질문이다. 나는 단지 모든 사람들에게 조금 더 도움이되는 질문을하고, 당신의 머리를 통과하는 추론을 포함시켜야한다고 말하고있다. 문제는 "자몽은 기후 변화의 요소입니까?" 연결이 무엇이라고 생각하는지 설명하는 것이 도움이 될 것입니다. – tenfour

답변

4

RAII은 널리 사용되지 않습니다.

초기 개념 리소스 획득 초기화은 모든 일이 발생했음을 보증하기 위해 생성자 사용에 관한 것이 었습니다. 이 아이디어에서 :

std::fstream out("somefile.txt", "w"); 

out 이제까지 생성 된 경우, 파일이 존재하고 사용할 준비가 보장해야한다.

따라서 지연 삽입은 RAII의 반대입니다!

참고 : 요즘 RAII는 주로 자동 정리을 나타 내기 위해 사용됩니다. 예를 들어 스마트 포인터입니다. 처음 목표에서 조금 벗어났습니다.


정리에 관한 또 다른 관용구 범위가 지정된 바운드 자원 관리에 대한 SBRM입니다. 그것은 결정 론적 정리의 아이디어를 완전히 포착하지는 못합니다. SBRM의 개념은 특정 객체가 범위를 벗어날 때 리소스가 정리된다는 것을 보장한다는 것입니다. 예를 들어 boost::scoped_ptr을 통해이를 수행 할 수 있습니다.

unique_ptr은 실제로 return입니다. unique_ptr이므로 리소스가 생성 된 범위에서 벗어날 수 있습니다!

+1

* 게으른 로딩은 RAII의 반대이다! * 이것은 사실이 아니다. 호출자에게는 RAII 객체가 하루 종일로드가 지연 될 수 있으며 호출자는 알 필요가 없습니다. 귀하의 예에서는 RAII가 파일이 즉시 생성되었다고 암시한다고 생각하지 않습니다. 개념적으로 * 생성 및 초기화되지 않고는 객체가 존재할 수 없다는 것을 의미합니다. 따라서 기본적으로'Init','Load','Create'와 같은 메소드를 금지합니다. 다시 말해서, 그들이 서로 상반된다는 말은 그들에게 존재하지 않는 관계를 제공합니다. 충돌하는 경우가 있지만 일반적으로 단순히 관련이없는 개념입니다. – tenfour

+0

@tenfour : 게으른로드가 잠재적으로 사용자에게 투명하게 할 수 있다고 동의하지만, 게으른로드가 실패하면 어떻게 처리합니까? 사용자가 자원을 가지고 있으며 획득하지 못했습니다. 눈에 띄는 예를 들면 뮤텍스 잠금을 생각해보십시오. RAII를 사용하면 잠금 개체를 빌드하면 뮤텍스를 잠그므로 안전하게 진행하고 내 작업을 수행 할 수 있습니다. 이제 당신이 게으른로드를 결정했다고 가정하고, 뮤텍스에 대한 잠금을 획득하고, 돌이킬 수없는 일을하고, 잠금의 게으른로드를 유발하는 "잠긴"항목을 사용하면 예외가 생성됩니다. Oups? –

+0

자유롭게 "자원"이라는 용어를 적용하는 방법에 따라 다를 수 있습니다. 그러나 생성자가 열린 파일 설명자를 실제로 얻지 못하면 Matthieu가 말한 것처럼 자원 획득 *은 초기화가 아니며 자원 획득은 나중에 언제든지 발생할 수있는 것입니다 (따라서 실패로 인해 나중에 실패 할 수 있습니다). 자원 획득). 무슨 tenfour 호출 "개념적으로 파일을 만드는"간단한 클래스 불변성을 수립 "(아마 : 그것이 무엇을 참조 파일 이름을 알고있다) 수립 수 있습니다. * a * 리소스 (예 : 이름 복사)를 획득 할 수 있지만 * 리소스는 가져올 수 없습니다. –

0

아니오; RAII는 동적 스토리지가있는 오브젝트가 자동 스토리지가있는 오브젝트에 랩핑되며 자동 스토리지가있는 오브젝트가 파기 될 때 파기됩니다.

게으른로드 (실제로 필요하지 않은 경우에만 개체를로드하고 전에는로드하지 않음)와 RAII는 실제로 관련이 없습니다.

2

아니요, 전혀 아닙니다. 또한, "새로운 스타일의 C++"은 "모든 사람은 제쳐두고 지난 15 년간 독점적으로이 일을 해왔습니다"라는 의미입니다.

RAII는 소유하고있는 소멸자에서 동적 객체를 정리하는 자동 저장 기간의 객체를 포함합니다. 소유권의 정확한시기는 부적합합니다.

+1

나는 내가 생각했던 것보다 시대에 뒤떨어 졌다고 생각한다. :) – codemonkey

3

머리 글자 이름 초기화 중에는 관용구의 초점이 파괴됩니다. 리소스 획득 초기화범위 한정 리소스 관리에 대한 것입니다. 리소스를 관리하고 범위를 벗어날 때 리소스를 지우는 개체가 있습니다.

관련 문제