Microsoft MVP성태의 닷넷 이야기
부모 클래스에서 예외 발생시 힙 영역에 할당 ? [링크 복사], [링크+제목 복사],
조회: 13057
글쓴 사람
궁금이
홈페이지
첨부 파일
 

안녕하세요 ?

C# 에서 부모 클래스를 상속 받고 있는 객체를 생성 했을때

해당 부모 클래스의 생성자에서 예외가 발생되면 힙영역에 할당 되지도 않는것이 맞나요?

제가 다음과 같이 코드를 작성하고 디버그 상태로 확인을 해보았습니다.

public class Account
{
        private string _id;
        public Account(string id, int pass) {
            if(id != "abc" || pass != 1234)
            {
                throw new Exception("인증오류");
            }
            _id = id;
        }

        public void 출금(long amount)
        {
            Console.WriteLine($"{_id} 계좌에서 {amount} 출금됨.");
        }
}

// Account를 상속
public class AttackAccount : Account
{
        public AttackAccount(string id, int pass) : base(id, pass)
        {
        }

        ~AttackAccount()
        {
            this.출금(10000);
        }
}


그리고 AttackAccount를 다음과 같이 생성 및 사용 하였습니다.

AttackAccount attackAccount = null;
try
{
    attackAccount = new AttackAccount("???", 1);
}
catch (Exception ex)
{
    //
}
GC.Collect();
GC.WaitForPendingFinalizers();


디버그로 실행시 당연히 오류가 발생되어 catch로 예외처리가 되고
잠시후에(실제 다른 이벤트 작업들이 처리 되면서(버튼 클릭 등)) AttackAccount 인스턴스의 소멸자가 호출 되는것을 확인했습니다.
소멸자가 호출되면서 출금 메서드도 정상적으로 호출 되었구요

디버그 모드라서 좀 다르게 동작된 것일까요?
내부적으로 어떻게 처리가 된건지 궁금합니다.








[최초 등록일: ]
[최종 수정일: 4/11/2023]


비밀번호

댓글 작성자
 



2023-04-11 04시38분
할당은 됩니다. new를 했을 때 타입의 크기에 해당하는 메모리가 Heap에 할당됩니다.

단지, 이후 생성자에서 예외가 발생하면 Heap에 할당된 멤버들의 초기화에 영향을 줄 뿐입니다. 따라서 위와 같은 경우에는 finalizer에서 출금 메서드가 호출되지만 _id 필드가 초기화되지 않았으므로 빈 값이 나옵니다.
정성태
2023-04-11 04시55분
[궁금이] 엇, 생성자에서 예외가 발생되도 Heap에 할당이 되는 군요..
생성자에 BP찍고 확인해 보아도 예외 발생 이후 중단점이 안걸리길래 Heap에 할당이 아예 안되는줄 알았습니다.
"초기화 작업이 안될 뿐 Heap에 할당은 된다!" 라고 보면 되겠군요
답변 감사합니다.
[guest]

... 31  32  33  34  35  36  37  38  39  40  41  42  [43]  44  45  ...
NoWriterDateCnt.TitleFile(s)
4813spow...3/8/201720468멀티 스레드 환경에서 처리하여야 할 목록을 효율적으로 사용하는 기법 질문 드립니다 [2]
4812popo2/23/201720668.NET Window ClassName 변경 질문 드립니다. [1]
4809힘찬도약2/15/201723606C# 가상 시리얼 [4]
4808이길용2/9/201722247WCF 외부 접속 관련해서 질문드립니다ㅠ [1]
4807헬조선식...2/8/201729890WPF의 속도에 대해서 궁금합니다. [3]
4803헬조선식...2/7/201722282WPF로 메신져 메세지 박스 구현 문의 [2]
4802spow...2/6/201719540특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은? [7]
4804spow...2/7/201718402    답변글 [답변]: 특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은?
4805spow...2/7/201718267    답변글 [답변]: 특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은? (글삭제가 안돼 재첨부합니다)파일 다운로드1
4801spow...2/3/201718086C#의 참조 동작관련하여 아이디어 문의 드립니다 [4]
4800오세운2/1/201722586C# 에서 C++ DLL임포트 질문입니다. [2]
4798guest1/29/201720323picturebox의 image.dispose [1]
4797김철환1/13/201720485책에 관한 질문입니다 [3]
4796Bere...1/13/201719872++ 후위연산자와 = 을 함께 사용할 때 생성되는 IL 코드 관련... [2]
4795김철환1/11/201721348이벤트 부분을 읽고 있는데 이해가 안되서 질문합니다.. [11]
4794김철환1/10/201718637안녕하세요 c# 6.0 책을 구매한 사람인데요 [3]
4793장준영1/7/201720483안녕하세요 c언어 처음 공부해보는 학생입니다 [4]파일 다운로드1
4792김재영1/4/201723338소스코드 공개 전 성태님의 의견을 듣고싶습니다 [3]
4791C#초보12/28/201622566비동기 소켓 close시 ObjectDisposedException 문제점 질문 있습니다.. [1]
4790미나리12/24/201622903파워포인트 쇼 제어 SimpleHttpServer.cs 작동문제 [4]파일 다운로드1
4789김솔지12/21/201620352프린트 시, 프린트하는 파일의 파일명 구하는 부분에 대해서 질문드립니다. [1]
4788짜두12/19/201621220Visual Studio 2015 에서 msbuild 12 사용 [5]
4787guest12/18/201624056VLC라이브러리에 대해 아시나요? [3]파일 다운로드1
4785Hyou...12/16/201622749WPF 개발 시 MVVM 프레임워크 사용 [2]
4784ds12/15/201618584문의 드립니다. [2]
4783후배12/13/201619394MemoryStream에 관한 질문 입니다. [5]
... 31  32  33  34  35  36  37  38  39  40  41  42  [43]  44  45  ...