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

안녕하세요 ?

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]

[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5953Roya10/4/2024199c# com host dll을 c++에서 사용할 때, sdk 관련 runtime 을 설치 안하고 제공할수 있을까요?? [1]
5952우광현9/5/20241419서버용 소켓 포트 동적포트 적용시 클라이언트가 호출하는 방법? [2]
5951Kun ...8/21/20241247c++에서 복합데이터 Struct를 .NET Framework에서 구현할 수 있는 방법이 있을까요? [2]
5950SunN...8/18/20241579정석대로 한다면 response.Close() 해야되는지요? [4]
5949SunN...8/16/20241658SqlConnection Open()에서 에러가나면 Close()하는 시점 [3]
5948SunN...8/14/20241718WebRequestMethods.Ftp.MakeDirectory 해제 [3]
5947Roya8/7/20242070c# dll을 cpp lib에서 사용을 할려고 하는데요. CoCreateInstance 에서 지정된 파일을 찾을수 없다고 나오는대요. [4]
5946SunN...8/5/20242184TaskDefinition 에서 사용저가로그온상관없이실행 [3]파일 다운로드1
5945SunN...8/3/20242017윈도우 작업스케줄러 [1]
5944roya8/1/20242079C# dll을 C++ 프로젝트에서 사용을 하고 싶은데, 레지스트리 등록 없이 가능한걸까요?? [2]
5943SunN...8/1/20241993윈도우C#에서 리눅스FTP로 업로드 및 리눅스에 폴더생성(WindowsOS에서C#으로) [3]
5942vict...7/24/20242199dll 을 c#에서 쓰고 싶습니다 [1]
5941vict...7/17/20243235DependencyObject와 같은 스레드에서 DependencySource를 만들어야 합니다. 오류 [2]
5940ckm7/16/20243586선생님 안녕하세요 async await 교착 관련 질문입니다 [1]
5939괴물신인7/9/20243376템플릿 대체할수있는방법이 있을까요? [6]
5938씨제바보7/5/20242601책 질문드립니다. [1]
5937Thor... donator5/27/20243714C# 12 는 전자책이 언제쯤 나오게 될까요? [1]
5936ds4/26/20244787활성화 되어 있는 커뮤니티 발견하게 되어 기분이 좋습니다. 자주 놀러 올께요. (내용 없습니다. [2]
5935양승조 donator4/25/20244835Reflection 관련 질문 드립니다. [5]파일 다운로드1
5934양승조 donator4/24/20243790Reflection 관련 질문 드립니다. [1]
5933vict...4/23/20243777cpp 라이브러리 디버깅 방법 문의 드립니다. [1]
5932EK4/12/20243834다음 제네릭에서 널익셉션이 뜨는 이유를 알수있을까요? [1]
5931이대희4/2/20244127Windows 앱 SDK C# 템플릿의 용도가 무엇인지요? [1]
5930vict...2/22/20245514ef core, FromSqlRaw 맵핑 질문입니다. [4]
5929a2/17/20244985.Net 8 에서 디버거 변경 [1]
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...