다음은 물론 모든 것이 정확하지는 않습니다. 읽을 때 소금 한알과 함께 가져 가십시오. :)
글쎄, 당신이 말하는 세 가지 것은 자동, 정적 및 동적 저장 기간 이며, 이것은 객체의 수명과 수명이 시작되는 시간 과 관련이 있습니다.
자동 저장 기간
당신은 자동 저장 기간 사용 짧은 수명 과 작은 에만 필요 데이터를 로컬로 일부 블록 내를 :
if(some condition) {
int a[3]; // array a has automatic storage duration
fill_it(a);
print_it(a);
}
수명은 블록을 종료하자마자 끝나고 객체가 정의 되 자마자 시작됩니다. 이들은 가장 간단한 종류의 스토리지 기간이며 특히 동적 스토리지 기간보다 훨씬 빠릅니다.
정적 저장 기간
사용 가능한 변수 (네임 스페이스 범위) 및 해당 범위의 종료 (로컬 범위)를 통해 수명을 연장해야하는 로컬 변수에 대해 모든 코드에서 항상 액세스 할 수있는 빈 변수에 대해 정적 저장 기간을 사용합니다. 클래스 (클래스 범위)의 모든 객체가 공유해야하는 멤버 변수 수명은 범위에 따라 다릅니다. 네임 스페이스 범위 와 로컬 범위 및 클래스 범위를 가질 수 있습니다 . 둘 다에 대한 진실은, 일단 그들의 삶이 시작되면 평생 은 프로그램의 끝에서 끝납니다 . 다음은 두 가지 예입니다.
// static storage duration. in global namespace scope
string globalA;
int main() {
foo();
foo();
}
void foo() {
// static storage duration. in local scope
static string localA;
localA += "ab"
cout << localA;
}
이 프로그램의 인쇄는 ababab
, 때문에 localA
그 블록의 종료에 파괴되지 않는다. 제어 범위가 정의에 도달하면 로컬 범위를 가진 개체의 수명이 시작된다고 말할 수 있습니다 . 의 경우 localA
함수 본문이 입력 될 때 발생합니다. 네임 스페이스 범위에있는 개체의 경우 수명은 프로그램 시작시 시작 됩니다. 클래스 범위의 정적 객체에 대해서도 마찬가지입니다.
class A {
static string classScopeA;
};
string A::classScopeA;
A a, b; &a.classScopeA == &b.classScopeA == &A::classScopeA;
보시다시피, classScopeA
클래스의 특정 객체가 아니라 클래스 자체에 바인딩됩니다. 위의 세 이름 모두의 주소는 동일하며 모두 동일한 개체를 나타냅니다. 정적 객체가 언제 어떻게 초기화되는지에 대한 특별한 규칙이 있지만 지금은 걱정하지 마십시오. 이는 정적 초기화 순서 fiasco 라는 용어를 의미합니다 .
동적 저장 기간
마지막 저장 기간은 동적입니다. 다른 섬에 개체를 배치하고 해당 참조 주위에 포인터를 놓으려는 경우 사용합니다. 객체가 크 거나 런타임 에만 알려진 크기의 배열을 만들려 는 경우에도 사용합니다 . 이러한 유연성으로 인해 동적 스토리지 기간을 갖는 객체는 복잡하고 관리가 느립니다. 해당 동적 지속 시간을 가진 객체는 적절한 새 연산자 호출이 발생할 때 수명을 시작 합니다.
int main() {
// the object that s points to has dynamic storage
// duration
string *s = new string;
// pass a pointer pointing to the object around.
// the object itself isn't touched
foo(s);
delete s;
}
void foo(string *s) {
cout << s->size();
}
수명은 delete 를 호출 할 때만 종료됩니다 . 잊어 버린 경우 해당 개체의 수명이 끝나지 않습니다. 그리고 사용자 선언 생성자를 정의하는 클래스 객체에는 소멸자가 호출되지 않습니다. 동적 저장 시간을 갖는 객체는 수명 및 관련 메모리 리소스를 수동으로 처리해야합니다. 라이브러리는 쉽게 사용할 수 있도록 존재합니다. 스마트 포인터를 사용하여 특정 객체에 대한 명시 적 가비지 수집 을 설정할 수 있습니다.
int main() {
shared_ptr<string> s(new string);
foo(s);
}
void foo(shared_ptr<string> s) {
cout << s->size();
}
객체를 참조하는 마지막 포인터가 범위를 벗어나면 delete 호출에 신경 쓸 필요가 없습니다. 공유 ptr이 자동으로 처리합니다. 공유 ptr 자체에는 자동 저장 기간이 있습니다. 그래서 그 수명이 자동으로 관리되어, 그것은 소멸자에서 동적 객체에 지적을 삭제할지 여부를 확인 할 수 있도록. shared_ptr 참조는 부스트 문서를 참조하십시오. http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/shared_ptr.htm