2010-01-18 4 views
2

Stroustrup의 C++ 프로그래밍 언어 책에서 그는 "리소스가 획득의 역순으로 배포된다는 것이 일반적으로 중요합니다"라고 말합니다. 왜 순서가 중요합니까?자원 관리 순서가 중요한 이유는 무엇입니까?

void acquire() 
{ 
acquire resource 1; 
... 
acquire resource n; 
use resources; 
release resource n; 
... 
release resource 1; 
} 

그래서 다음과 같이 주문을 변경하면 어떻게됩니까?

void acquire() 
{ 
    acquire resource 1; 
    ... 
    acquire resource n; 
    use resources; 
    release resource 1; 
    ... 
    release resource n; 
} 

답변

0

자원, 실제 코드에서 일반적으로 중첩, 그것을 파괴 할 때 사용할 수 있도록 객체를 생성 할 때 사용 가능한 아무것도 할 것입니다. C++에는 결정적 파괴가 있기 때문에 순서를 지정해야하며 FILO ("first in, last out")가 잘 작동합니다.

중첩의 가장 간단한 예는 클래스입니다.

struct Base { 
    Base() { cout << "Base\n"; } 
}; 
struct Member { 
    Member() { cout << "Member\n"; } 
}; 

struct Derived : Base { 
    Member member; 
    Derived() { cout << "Derived\n"; } 
}; 

지금이 예제와 비슷한 출력 DTORS을 추가 할 수 있습니다 그들은 항상 먼저 건설 기지, 다음 회원 다음 파생 ctor에의 몸에 의해 구성된다.

파생 된 데이터가 파기되기 전에는 데이터베이스를 파괴 할 수 없습니다 (파생 된 데이터를 사용해야 할 수도 있음). 회원과 동일합니다.

4

교착 상태 나 누출 상황에 빠질 수 있습니다. obj1 선언하고 Obj2-Obj3 할당합니다. 당신은 자유롭게하기 전에 2와 3을 해방시켜야합니다. 실제로는 생성자와 소멸자가 올바른 순서로 호출되기 때문에 걱정할 필요는 없습니다.

3

일반적으로 중첩 메모리 할당이 있습니다.

E.g. you have a class 
class A{ 
    FILE *fp; 
    char *name; 
    xxx; 
} 

는 먼저 사용 new A의 자원을 할당하고, 나중에는 조작해야하는 A의 fpname. 따라서 리소스를 해제 할 때는 fpname을 먼저 배포 한 다음 A을 배포해야합니다.

1

가장 일반적인 의미에서 "중요하면 중요합니다." 종속성은 필요한 파괴 순서를 나타냅니다.

기존 응답은 중첩 된 리소스를 역 위상 구조로 해제하는 것과 관련이 있습니다.

또한 C++은 개체 내의 리소스가 초기화되는 순서를 정의합니다. 이것은 회원 구성이 이전에 초기화 된 "형제 자매"를 사용할 수 있음을 의미합니다. 즉, 의존성을 가지며 그 형제 자매는 여전히 파괴시 유효해야 함을 의미합니다.

class A { 
    A(std::string *link2str); 
    ~A(); 
    std::string *important_state; 
}; 

class B { 
    string first; // initialization occurs in the order of declaration 
    A second; 
    B() : first(), second(&first) { } // not the constructor's list order 
}; 

이 예제는 좋은 디자인처럼 보이지 않지만 결코 모를 것입니다. 때로는 회원 간의 일종의 의존성에 대한 이유가 있습니다.

관련 문제