|
아래의 주신 질문이
어떤 특정한 객체내의 매쏘드를 말하시는 거라면,
먼저 그 매쏘드가 속한 객체의 수명과의 관계를 먼저 결정하셔야 할 듯 합니다
만약, 매쏘드내에서 사용하고자하는 컴포넌트 객체가 앞에서 말씀드린 객체와 같다면
그 객체의 멤버로 선언을 변경 하시면 될 듯 하고요,
그렇지 않고, 매쏘드내에서만 유효하다는 판단을 하시면 그 매쏘드내에서만 살아남도록 처리하면 될듯 합니다.
그런데, 그도 저도 잘 모르겠다면, 그냥 멤버 변수로 하셔도 될듯합니다(매우 힙을 심각히 많이 사용한다면 제외.)
변수 라이프싸이클 관리와 관련하여 한가지 요령은
이게 잘 판단되지 않으시면, 저의 경우는 그냥 멤버 변수로 포인터 선언하시고, 생성자에서 널로 초기화 하신다음.
호출되는 매쏘드에서 널이면 생성하여 사용하고, 아니면 객체를 해제하거나 경우에 따라서 초기화 매쏘드가 지원되면
재 사용하는 방법으로 하면 별 문제 없습니다. 물론 어디서든지 해제하고 반드시 포인터에 널만 채워 놓으면 됩니다.
물론 소멸자에서 객체가 살아있다면 해제하면 되죠.
그 외 글로벌 객체로 선언하는 것은 별로 권장하고 싶지 않습니다.
물론 편한 경우도 많지만, 일반적으로 사용하지 않도록 해야 합니다.
가장 하지 말아야 할것은 매쏘드내 지역 변수 포인터에 할당된 객체를 리턴하여 외부로 내 보내는 것입니다.
그렇게하면 객체의 소유관계가 불 분명하게 되고, 그 객체를 해제 하지 않을 가능성이 높아집니다.
그런 경우는 객체 위임 관계에 대한 내용 정리하시면 됩니다.
뭐, aggregation, composition 이런 내용 구글링하시면 됩니다.
그리고, 디자인 패턴 잘 공부해 두시면 도움이 됩니다.
아래의 내용 정리해 보세요.
1) 변수를 정의하면 메모리 구조에 어떻게 할당되는지 정리
코드영역 > 데이터 영역 > 힙영역 > 스택영역
2) 1) 항목에 따른 변수의 수명 관계 정리.
-> 예) 지역변수는 스택에 생성이 되고, 함수를 리턴하면 자동으로 없어진다.
너무 정신없게 설명했나?
참고 바랍니다.
만나바 님이 쓰신 글 :
: 메소드에서 new를 통해 컴포넌트 객체를 생성한다음에 메모리를 해제할려면
: 해당 메소드 안에서 메모리를 해제 해야되는걸로 알고 있는데 해당 메소드 안에서 객체의
: 메모리를 해제하면 메소드 호출시 해당 컴포넌트 객체가 바로 삭제되는거자나요.
: 지역변수처럼 선언된 객체를 해제 하려면 어떻게 해야할까요? ( 변수들을 다 전역변수로 선언해야할까요?)
|