강한 스마트 포인터와 약한 포인터, 퍼뮤테이션 벡터를 이용한 C++ 에서의 리소스 관리 방법론
위 글타래에서 아래의 url 을 소개받았었습니다.
http://www.relisoft.com/resource/resmain.html
그 문서를 읽고 나름대로 요약을 해보았습니다.
C++ 에서 메모리 릭 혹은 메모리 이중 해제와 같은 성가신 문제를 해결하는 방법으로 이 글에서는 리소스 관리의 한 방법론을 설명한다.
이는 리소스 관리의 한가지 전제 , 그리고 리소스 획득의 한가지 원칙 으로 설명할 수 있다.
리소스 관리의 한가지 전제 : 모든 리소스가 자신의 소유자를 갖도록 해야 한다.
리소스 획득의 한가지 원칙 : 리소스의 할당(획득)은 생성자에서 리소스의 해제는 그에 상응하는 소멸자에서 수행해야 한다.
리소스는 자동 리소스(언어적 특징으로 리소스 관리가 자동으로 이루어짐. 자동변수)와 동적 리소스(new, delete 등, 크리티컬 섹션, 파일 등 처럼 명시적으로 할당 및 해제를 수행해야 함)가 있는데 리소스 관리의 관심사항은 동적 리소스이다. 요약해서 얘기하면 이 글의 방법론에서는 동적리소스도 std::auto_ptr 을 활용해서 자동리소스처럼 취급하도록 한다. 소유권을 가지는 강한 스마트 포인터와 소유권을 갖지 않는 약한 포인터의 개념이 도입되며 소유자가 두 개 이상 되어야만 하는 경우 사용할 수 있는 래퍼런스 카운트 기반의 스마트 포인터도 설명한다. 이를 위한 구체적인 가이드라인을 제시하며 소스코드도 제공한다.
글을 읽으면서 new를 항상 생성자가 불리는 곳에서 매개변수로 리소스를 할당하는데 사용하는 모습을 보면서 디자인패턴의 팩토리 패턴도 생각해보았다. 하지만 팩토리 패턴은 알고리즘과 구체적 구상클래스의 핸들링을 분리하는데 의가 있는 것으로 이 글의 리소스 관리의 방법론과는 차원이 다른 범주의 이야기이다.
글의 마지막에서 소개하는 사례가 아마도 이 글의 핵심적인 내용일 것이다. auto_ptr과 auto_vector를 사용해서 동적 리소스를 자동리소스화 했다. 이 때 사용된 auto_vector는 Permutation Vector 라는 것으로 소유권을 가지는 강한 스마트포인터(auto_ptr)을 퍼뮤테이션 벡터 한군데에 모아두고 핵심 알고리즘의 수행은 소유권을 갖지 않는 약한 포인터를 통해 표준 컨테이너 상에서 수행하고 있다.
질문 : 강한 (스마트) 포인터, 약한 포인터, 퍼뮤테이션 벡터 등의 용어는 어떤 과목에서 정의한 것인가?
단순한 질문을 할 수도 있었지만 좋은 토론을 할 수 있을 것 같아서 토론토의란에 글을 처음으로 써봅니다.
원문을 쓴 Bartosz Milewski 는 내공으로 보면 이름이 있는 분 같습니다. MS 출신이신 것 같고요... 그런데 이 글에서 이야기하고 있는 핵심적인 개념이 이 분만의 독창적인 것은 아닌 것 같은데, 이런 개념을 연구하는 전공과목이 있는지 궁금합니다. 컴공 학부나 대학원에서 어떤 과목에서 이런 내용을 연구할까요?
Call By Reference 와 Memory Management 정책 관련이지 싶은데요?
전통적인 C 의 경우 명시적으로 Call by Value 와 Call by Address Value ( 이 부분은 이견이 있을 것으로 보입니다. ) 를 지원합니다.
C 와 별도로 C++ 표준에 Reference Concept을 지원하고자 하는 부분이 포함되어있습니다.
Java 와 같은 reference 기반 언어의 경우의 Gabage Collection의 대상에 대해 정책정 기준을 정하게 되었고,
C++ 도 마찬가지로 reference 에 대해 접근하면서, 수많은 참조 가능성에 대한 구분이 필요했을 것이라고, 추측됩니다. ( 단지 제 생각이지만 ㅜㅡ )
Strong / Weak 등 실제 구현된 API 또는 Template API 등에서 실제 이름이 포함되어 있는 경우도 보이며,
이론적으로 정립된 reference document 에서도 찾아볼 수 있습니다.
아마도 +_+ 이 부분에 대해서 다음 전문가 분들이 언급해 주실거라는 기대를 품고
이 정도에서 짧은 언급을 마치겠습니다.
원문에도 Garbage Collection 의 언급이
원문에도 Garbage Collection 의 언급이 되어있습니다. 결국 자신의 방법론은 자바 플랫폼의 GC 를 C++ 에서 구현한 것과 같게 된다고...
오늘 아침에도 그 생각이 들더라구요. 결국 GC 를 구현한 것이구나.... C++ 프로그램 하기란 얼마나 어려운가... 다른 언어에서는 언어적 특징으로 제공해주는 기능을 이렇게 고민고민해서 구현해서 사용해야 하니까요... 이런 개념이 잡히기 까지도 경험이 많이 필요하구요... C++ 참 어렵다... 이런 생각이 들더군요..
Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.
The introduction of strong
The introduction of strong pointers into the language would make garbage collection history. There is only one small problem--modifying the C++ standard is as easy as running for (run for : 출마하다)President of the United States. When I mentioned my idea to Bjarne Stroustrup, he looked at me as if I just asked him to lend me a thousand dollars.
원문의 앞부분에 나와있는 내용입니다. 내용인 즉,
번역은 좀 의역이 되었고 자신이 없습니다만...
흥미로운 것은 이 내용을 자신이 비잔 스트럽스트롭씨에게 제안을 했었다고 하고, 그런데 그 사람이 마치 자기를 보기를 한 천달라쯤 빌려달라고 얘기했던 것과 같은 표정으로 바라보더라고요...
C++ 표준의 auto_ptr 에 이런 깊은 의미가 있는 줄을 이제 조금 알 것 같습니다.
이 답글은 윗분께서 GC를 언급하셔서 그와 관련된 내용이 기억나서 소개해봅니다.
Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.
...
> The introduction of strong pointers into the language would make garbage collection history.
이 부분의 해석은 "이 언어(C++?)에 strong pointer를 도입한다면 garbage collection은 과거의 유물이 될 것이다."입니다. 정확한 맥락은 모르지만 이 문장만 보면 strong pointer가 너무나 훌륭하기 때문에 이게 있으면 garbage collection 따위를 고민할 필요가 없어진다...쯤 되는 것 같습니다.
아 그렇군요!! 아이구 쥐구멍이 어딘가요? 제가
아 그렇군요!!
아이구 쥐구멍이 어딘가요?
제가 오해를 하고있었네요. GC를 구현하게 되는게 아니라 GC자체의 필요성을 없애게 된다.
감사합니다. 좋은 지적이었습니다.
이런 건 번역이나 원서를 많이 본 분만이 지적해줄 수 있는 것 같아요. 찜찜한게 남아있었는데 코딩에서나 번역에서나 마친가지 인 것 같아요. 완벽함을 추구해야 할 필요가 있다는 걸 새삼 느꼈습니다.
Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.