Microsoft MVP성태의 닷넷 이야기
글쓴 사람
김민아
홈페이지
첨부 파일
 

안녕하세요 선생님 예전부터 궁금해왔던 건데
예를들어 Process.Start() 메소드나 req.GetRequestStream() 메소드 등이 (req는 HttpWebRequest 객체변수입니다)
반환하고 있는 객체들을 보면 IDisposable를 구현하고 있는데 이러한 비관리 객체들을 반환하는 메소드를 호출 시에는
무조건 변수로 받은 이후에 Close 나 Dispose를 해줘야 하는 것인가요?
제가 생각하기로는 req.GetRequestStream().Write(~~) 이런 형태의 연속 참조를 사용을 하게 되면 참조를 받아줄 변수가 없어도 저 메소드 내부에서 생성한 비관리 객체가 해제가 안될 것이라고 생각이 들어서
위에 방법이 맞다고 생각하는데 막상 저 객체의 상태 여부를 확인할 방법을 몰라서 답답한 마음에 질문드려봅니다 ㅠㅠ

정리하자면 변수 선언없이
req.GetRequestStream().Write(~~); 이런 형태보다는

Stream stream = req.GetRequestStream();
stream.Write(~~);
stream.Close();

이렇게 사용하는 게 맞는 방법인 걸까요?








[최초 등록일: ]
[최종 수정일: 3/8/2022]


비밀번호

댓글 작성자
 



2022-03-08 10시37분
IDisposable이 구현된 객체라면 가능한 Dispose를 호출하는 것이 좋습니다. 대신 호출하지 않아도, 이후에 닷넷 런타임의 GC가 있기 때문에 결국은 해제가 됩니다.

예를 들어, FileStream으로 "test.txt"라는 파일을 열은 경우를 가정해 보겠습니다. 만약 사용 후 바로 Close (또는 Dispose)를 했다면 test.txt 파일(그것의 Handle)은 바로 해제될 것입니다. 반면 호출하지 않았다면 이후 응용 프로그램의 활동이 누적되면서 GC가 불릴 때 FileStream이 구현한 소멸자에 의해 (그것을 참조하고 있는 다른 개체가 없는 상황에서) 파일이 닫히게 됩니다.

안정적인 응용 프로그램을 만들고 싶다면 "무조건" 호출하는 것이 좋습니다. 단지 개발자의 부주의로 호출하지 않았어도 웬만큼 극한 상황이 아니고서는 그런데로 프로그램은 잘 돌아갑니다.

--------------------------------

첨언하면, "비관리 객체"를 사용하는 FileStream과 같은 객체를 만든다면 반드시 소멸자를 정의해야 합니다. 마이크로소프트가 제공하는 BCL의 수많은 클래스들은 내부적으로 "비관리 객체"를 사용하면 소멸자를 구현해 두었기 때문에 일단은 안심하셔도 됩니다.

하지만, 만약 마이크소프트가 만들지 않은 (비관리 객체를 사용하는) 클래스라면, 소멸자가 정의되었는지 확인해 볼 필요는 있습니다. 만약, 소멸자가 정의되지 않았다면 그런 경우에는 개발자가 "반드시" Dispose를 호출해야 합니다. 그렇지 않으면 프로그램의 활동으로 인해 계속해서 메모리 누수가 발생하게 됩니다.

---------------------------------

반면, FileStream을 필드로 포함하는 관리 객체를 만든다면 IDisposable만 구현하고 소멸자 정의는 하지 않아도 됩니다. 왜냐하면, 비관리 객체의 해제는 FileStream 내부의 소멸자에 의해 될 것이므로, 굳이 그것을 사용하는 객체에서 소멸자를 다시 정의해 FileStream의 Dispose를 호출할 필요는 없습니다.
정성태
2022-03-08 02시24분
[김민아] 아 결국은 소멸자 내부에 Dispose를 구현하고 있나 보네요.. 상세한 답변 너무 감사합니다 선생님
[guest]

... 46  47  48  49  50  51  52  [53]  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
1528김개똥2/14/201516872좀 관련없는 질문이지만, 정말 답답하고 찾는데 명확한 해답 찾지못해 질문 올립니다. <Windows 사용자 인증> [1]
1527방문자1/27/201518293System Timer의 Tick에서 Backgroundworker를 호출하면 스레드 문제가 있을까요? [1]
1526황상대1/26/201520414C# 마샬링 관련 질문이 있습니다. [1]
1525Ji-y...1/19/201519030시작하세요 C# 프로그래밍 도서에 관한 질문입니다. [1]
1523임종복12/31/201426948windows 2008 r2에서 ms-sql 2008 서버사용시 tls문제점 [3]
1524임종복1/4/201521481    답변글 [답변]: windows 2008 r2에서 ms-sql 2008 서버사용시 tls문제점 [2]
1521윤대욱12/19/201418161C++ 에서 서버와 클라이언트를 나누어서 구조체 전달에 대해서 궁금합니다. [1]파일 다운로드1
152012/10/201418755datetime관련해서요 [1]
1516aTo12/1/201417785wpf 배포관련. [3]
1514얄미운제리11/17/201418659[C# Mono]Mono Chart 개발 문의드립니다. [1]
1355미나리나물11/13/201416131RDP 접속 방식 질문드리고 싶습니다. [1]
1353송용국11/10/201415309TeamFoundationServer 에 소스를 Target서버로 옮기는(내려주는) 방법 있나요? [1]
1351blue...11/7/201420685c# webbrowser 모바일환경 접속 [1]
1350에메11/7/201420517WCF namedpipe 퍼블리싱 충돌 문제 [3]파일 다운로드1
1349Chun...11/6/201424649Microsoft. Net Framework 액세스 거부 오류...... [2]
1348김준석11/6/201420807 Mini dump 기록 안되는 현상 [2]파일 다운로드1
1346개미11/5/201435299https페이지에서 http서버에 있는 이미지 파일 호출시 보안 오류 [8]
1345장구니11/4/201419054AWS 인스턴스를 만들었는데 [1]
1343h11/2/201418697안녕하세요 [1]
1342왕초보11/1/201423510C#에서의 함수포인터 [13]
1347왕초보11/5/201418247    답변글 [답변]: C#에서의 함수포인터 [1]
1341영택10/29/201419423MFC Amazon S3 사용관련하여 질문드립니다. [2]
1344영택11/4/201415980    답변글 [답변]: MFC Amazon S3 사용관련하여 질문드립니다. [2]
1340감사합니다10/28/201420579c# wpf shdocvw internet explorer를 윈도우프레임으로 집어 넣을 수 있는지 궁금합니다. [3]파일 다운로드1
1338헬프미10/28/201421332tcp 소켓의 SYN_RECV 상태에 대하여 질문있습니다. [3]
1336이소정10/27/201416671filestream seek에 대해 질문있습니다. [1]
... 46  47  48  49  50  51  52  [53]  54  55  56  57  58  59  60  ...