2010-03-25 5 views
15

앱이 충돌하면 소멸자가 호출됩니까? 처리되지 않은 예외라면 추측 할 수 있지만 더 심각한 오류는 무엇입니까? 아니면 사용자가 응용 프로그램 프로세스를 종료하는 것과 같은 문제는 무엇입니까?Destructor - 앱이 충돌하면 호출됩니다.

그리고 몇 가지 더 잠재적으로 바보 같은 질문 :

응용 프로그램을 종료하고 모든 파이널 라이저가 실행 된 응용 프로그램의 모든 개체에 무슨 일
  • - 객체가 쓰레기 수집 얻거나 그들은 모두 어떻게 든있다 할 " 언로드 "프로세스 또는 appdomain?
  • 은 각 응용 프로그램의 가비지 수집기 부분 (동일한 프로세스에서 실행 됨)입니까, 아니면 독립적입니까?
+1

어떤 종류의 충돌이 발생합니까? 예외는 크래시는 아니지만 복구 가능한 오류입니다. – Dykam

답변

21

본인 스스로 시도해 보시기 바랍니다. 예 :

using System; 

class Program { 
    static void Main(string[] args) { 
    var t = new Test(); 
    throw new Exception("kaboom"); 
    } 
} 
class Test { 
    ~Test() { Console.WriteLine("finalizer called"); } 
} 

마지막 프롬프트가 표시되도록 명령 프롬프트에서 실행하십시오. throw 문이 주석 처리 된 첫 번째 구문입니다.

Windows에서 처리되지 않은 예외와 마찬가지로 Windows에서 제공하는 기본 예외 필터는 WerFault.exe로 표시되는 Windows 오류보고 대화 상자를 호출합니다. "프로그램 닫기"를 클릭하면 WerFault는 TerminateProcess()를 사용하여 프로그램을 종료합니다. 프로그램이 정상적으로 종료 될 때와 같이 종료 자 스레드를 실행할 수있는 기회는 없습니다.

그러면 Windows가 파편을 정리합니다. 프로그램이 열었을 수도있는 운영 체제 핸들을 자동으로 닫지 만 파이널 라이저에서 닫을 기회를 얻지 못했습니다. 파일은 여기서 까다로운 문제이며, 버퍼가 플러시되지 않으며 디스크에 부분적으로 쓰여진 파일로 쉽게 끝납니다.

+1

+1. Thx, 매우 유익한. 나는 이것과 몇 가지 다른 아이디어들에 대해 무엇을 할지를 분명히 알려줄 것입니다. – anakic

4

나는 C#을 모르지만 다른 프로그래밍 언어에 대한 내 경험을 바탕으로 추측 할 수 있습니다. 앱이 다운되면 심각한 오류가 있음을 의미합니다. 잘못된 메모리 처리 등. 어떤 경우에도 소멸자/deallocators/finalizers/...를 실행하려고하는 프로그래밍 언어는 이상합니다.()를 다시하지 C#을 특이를 다른 질문에 대답하려고 잊었지만 일반적으로한다는 보장은 없다 소멸자/deallocators/파이 나라/... : 업데이트

는) 상황이 아마 더 잘못 될 것 실제로 전화를받습니다. 그 이유는 프로세스가 종료 될 때 소멸자 등을 실행하여 메모리를 정리하는 것보다 프로세스에 사용 된 메모리 블록을 간단히 "압축"하는 것이 훨씬 쉽고 효율적이라는 것입니다.

기술적 인 세부 사항을 너무 많이하지 않고 마지막 질문에 답변하는 방법을 모르겠습니다. 가비지 콜렉터를 설계하고 실행할 수있는 여러 가지 방법이 있지만 가비지 콜렉션이 현재 프로세스를 중지하고 완료 될 때까지 계속하는 것이 가장 쉽지만 가비지 콜렉터를 동시에 실행할 수는 있지만 가능합니다 (그러나 더 어렵습니다) 수집하는 메모리가있는 프로세스

이 모든 것을 더 잘 이해하려면 가비지 수집 이론을 읽어보십시오. 실제로이 주제에 대한 전체 사이트는 www.memorymanagement.org입니다.

+0

Thx, 좋은 답변입니다.그러나 1 가지가 옳지 않은 것처럼 보입니다. 앱이 정상적으로 종료 되더라도 일부 소멸자는 여전히 불려 가지 않을 수도 있다고 말합니다. 가비지 수집기 또는 다른 누군가를위한 방법이 없기 때문에 나에게 맞는 것 같지 않습니다. else (그러나 객체 자체)를 사용하여 응용 프로그램의 관리 대상 객체가 어떤 원시 리소스를 사용했는지 알 수 있으므로 처리 할 수 ​​없습니다. 어쨌든 나는 그것을 시도해 보겠다. 노기꾼이 다정한 것처럼, 조금 시간이 지나면 결과를 게시해라. – anakic

+0

나는 C#에 대해서 정말로 말할 수는 없지만, Objective-C는 흥미로운 예제를 여기에 제공한다. 'dealloc'(GC가 꺼져있는 경우 소멸자) 및 'finalize'(GC가 켜져있는 경우)에 대한 설명서를 비교해야합니다. 'dealloc'의 경우 문서가 호출 될 것이라는 보장이 없으며 예를 들어 파일을 닫는 데 의존해서는 안된다는 것을 매우 명시 적으로 말합니다. '마무리'의 경우 문서가 흐릿 해져 파일이 닫히는 등의 '백업'으로 '마무리'에 의존 할 수 있다고 제안하는 것 같지만 '마무리'라고 명시된 문장을 찾을 수 없습니다. 부름을받을 수 있도록 보장합니다. – Rinzwind

+0

Objective-C에서 'dealloc'및 'finalize'에 대한 설명서 링크가 있습니다. BTW : 단순히 C#에서 호출되는지 여부를 확인하기위한 실험을 시도하는 동안 문서를 살펴 봐야합니다. 실험에 전화가 걸렸지 만 문서에 * 보증이 없다고 표시되면 차후 버전이나 다른 플랫폼에서 변경 될 수 있으므로 사용하지 않는 것이 좋습니다. Obj-C 문서. 링크 : http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/dealloc – Rinzwind

3

응용 프로그램을 종료하는 경우 응용 프로그램이 거의 100 % 제어권을 즉시 잃어 버리며 소멸자를 호출 할 기회가 없습니다.