ringa_lee2017-04-18 10:53:17
포인터 new
를 사용하여 개체를 얻은 경우 소멸자는 delete
와 같이 자동으로 개체를 삭제하지 않습니다. 클래스 std::string* s = new std::string;
는 재활용되지만 s
이 가리키는 공간은 재활용되지 않습니다. 참조가 실제로 별칭이라는 점만 기억하면 됩니다. s
阿神2017-04-18 10:53:17
너무 많이 말하지 말았어야 했는데, 제대로 이해하지 못했습니다.
함수가 끝나면 함수 본문에 선언된 자동 변수와 함수의 형식 매개변수만 파기(파기)되며, 이들이 참조하는 객체(있는 경우)는 파기 시 파기되지 않습니다. . 포인터/참조에 의해 참조되는 객체는 자신만의 독립적인 저장 기간을 가집니다. 이 객체가 소멸되는 시기는 자체 저장 기간에 따라 다릅니다.
질문에서 질문하신 내용은 소멸자가 암시적으로 호출되는 경우입니다. 소멸자에 대한 암시적 호출도 객체의 저장 기간에 따라 달라집니다. 간단히 말해서, 객체가 생성되면 해당 객체가 파괴될 때 소멸자가 호출됩니다.
12.3.2.11 소멸자는 암시적으로 호출됩니다
— 프로그램 종료 시(3.6.3) 정적 저장 기간(3.7.1)을 갖는 생성된 객체의 경우,
— 스레드 저장 기간( 3.7.2) 스레드 종료 시,
— 자동 저장 기간이 있는 생성된 객체의 경우(3.7.3) 객체가 생성된 블록이 종료될 때(6.7),
— 수명이 다할 때 생성된 임시 객체의 경우 임시 개체 종료(12.2),
— new-expression(5.3.4)에 의해 할당된 생성된 개체의 경우, delete-expression(5.3.5) 사용을 통해,
— 예외 처리(15.3).
인용정보:
참조는 객체가 아니지만 저장 기간도 있습니다(저장 기간은 모든 변수에 적용됩니다). 참고문헌에도 보관기간 파기규정이 적용됩니다.
하지만 참조가 파기되면 어떤 일이 발생하는지에 대한 정확한 설명을 찾지 못했습니다. 참조가 소멸되는 정확한 방법은 컴파일러 구현에 따라 달라집니다. 일반적인 상황은 다음과 같습니다. 참조가 구현 중에 저장 공간을 차지하면 공간이 회수됩니다. 소유가 없으면 아무 일도 일어나지 않습니다. (참조 유형의 형식 매개변수는 함수가 인라인되지 않은 경우 저장 공간을 차지하는 경우가 많습니다)
3.7.3 저장 기간 카테고리는 참조에도 적용됩니다. 참조의 수명은 저장 기간입니다.
8.3.2.4 참조에 저장이 필요한지 여부는 지정되지 않습니다.
3.9.8 객체 유형은 함수 유형도 아니고 참조 유형도 아니고 void 유형도 아닌 (cv 한정) 유형입니다.
1.8 [...] 객체는 저장 영역입니다. [ 참고: 함수는 객체와 같은 방식으로 저장 공간을 차지하는지 여부에 관계없이 객체가 아닙니다. ] [... ]
怪我咯2017-04-18 10:53:17
1. 소멸자는 클래스용으로 도입된 함수로, 클래스 변수의 수명 주기가 끝난 후 공간이 재활용되기 전에 호출됩니다.
2. 클래스 포인터와 클래스 참조(변수를 가리키는 상수 포인터)는 기본 데이터 유형(포인터)일 뿐입니다. 해당 스택 공간은 함수 호출이 완료된 후 재활용됩니다.
3. 전달된 매개변수가 클래스 객체인 경우 첫 번째 지점에서 언급한 것처럼 공간이 재활용되기 전에 소멸자가 호출됩니다.
4. 스택의 모든 클래스 변수는 수명 주기가 끝난 후 자동으로 소멸되지만 힙의 클래스 변수(new 등의 작업에 의해 할당됨)는 소멸자 호출을 트리거하기 위해 수동으로 해제되지 않으며 필요합니다. .