다형성과 연관된듯한 메모리 누수 문제입니다.
글쓴이: pok / 작성시간: 화, 2005/12/20 - 7:42오후
CPUscheduleAL* pCPUscheduleAL = new FCFS; ... delete pCPUscheduleAL;
CPUscheduleAL을 상속받는 클래스중에 FCFS라는 클래스가 있고, 다형성을 이용하기위해 위와 같이 선언을 했는데요, valgrind로 메모리누수 체크하는도중에 이부분에서 reachable block라고 나옵니다. 분명 delete를 해줬는데도요...
원인이 무엇일까요?
(음... 학교숙제 미워요.. 놀고 싶어요.)
Forums:
Re: 다형성과 연관된듯한 메모리 누수 문제입니다.
저는 valgrind를 안 써 봐서(-_-;) 모릅니다만, 혹시 소멸자가 virtual이 아닌가요?
- 토끼군
소멸자는 virtual로 했는데, 딱히 소멸자에서 해주는 일은 없습니다.
소멸자는 virtual로 했는데, 딱히 소멸자에서 해주는 일은 없습니다.
단지 다을수만 있을뿐이야~ 하하~ (.....) 하면서 최면을 걸고 있습니다.
실행시에 별다른 문제가 있는것은 아닙니다. 그냥 조금 찝찝해서 여러분들은 어떤식으로 저러한 코드를 처리하며, 저렇게 처리하는것이 절차에 맞는것인지 궁금해서요..
poklog at http://poksion.cafe24.com/poklog/
부모(이경우 CPUscheduleAL)의 소멸자가 virtual 이 아니
부모(이경우 CPUscheduleAL)의 소멸자가 virtual 이 아니면
(예를 들어 자식만 virtual)
메모리 누수가 발생할 가능성이 있습니다.
워낙 짧은 코드라서 절차에 맞고 안 맞고 따질것도 없어보이네요.ㅋ
참고로 저라면 이렇게 할것 같습니다.
CPUscheduleAL* const pCPUscheduleAL = new FCFS;
일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.
답변들 정말 감사합니다. 그럼 염치불구하고 코드올려 부탁드리겠습니다.
답변들 정말 감사합니다. 그럼 염치불구하고 코드올려 부탁드리겠습니다.
CPUscheduleAL의 파생클래스로 FCFS가 있고 SJF, RR등등이 있습니다.
CPUscheduler 이라는 클래스에서는 CPUscheduleAL을 Strategy Pattern으로 이용합니다.
pCPUschedulAL은 Factory Method Pattern으로 만들어지는데, 소멸은 위 코드처럼 제가 직접시켜줍니다. 더 좋은 방법있으면 지적부탁드립니다.
변하지 않는것은 상수로 쓰는것이 좋은건 알고 있는데, 당췌 상수성이 어디에 붙는건지 잘 몰라 활용을 못하는데(예를들면 CPUscheduleAL* const pCPUscheduleAL인게 옳은건지 const CPUscheduleAL* pCPUscheduleAL 가 옳은건지 등등) 참고할만한 문서(..이왕이면 한글로 되어있고 친절한..) 추천 부탁드리겠습니다.
poklog at http://poksion.cafe24.com/poklog/
[quote="pok"]변하지 않는것은 상수로 쓰는것이 좋은건 알고 있는
이 내용만 간단히 설명드리면
const 는 별표(*)를 기준으로 좌측과 우측이 다릅니다.
const int * a; 이것과 int const * a; 는 같은 의미가 되고요
a->a = 3; 이런걸 막게 됩니다. 포인트 하고 있는 메모리 공간에 대한 상수성을 정의합니다.
반면에
int * const a = new int; 이것은 a = new int; 와 같이 a가 가르키는 메모리 주소값 자체를 바꾸지 못하게 막습니다.
이 내용은 Effective C++ (스캇 마이어) 에 자세히 나와있었던걸로 기억합니다.
이책 안보셨다면 꼭 보시기를 권하고 싶습니다.
C++ 필독서입니다. (번역본도 볼만합니다.)
일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.
보여주신 소스 코드를 읽어봤습니다.음. 사용되는 방식을 보지 못해
보여주신 소스 코드를 읽어봤습니다.
음. 사용되는 방식을 보지 못해서 잘 모르겠지만
CPUscheduleAL 객체가 소멸되는 시점에서
아래 맴버 변수들을 delete 해야하지는 않을까요?
Queue* pQueueReady_;
Queue* pQueueRun_;
Queue* pQueueNotYet_;
Queue* pQueueWait_;
Queue* pQueueHalt_;
위의 변수들을 소멸시켜주는 책임자가 따로 있다면
다른 부분에서는 문제가 될 것 같은 부분은 보이지 않네요...
그리고, 별 이유가 없다면 맴버 변수는 protected보다는 private에 넣는 것이 좋을듯 합니다.
그리고 protected에 넣어야 할 변수가 생긴다면 변수를 protected로 옮기지 말고 해당 변수에 접근하는 메소드를 protected에 추가하는 방식으로 하시는 것이 나중에 확장성을 고려했을때 좋다고 생각합니다.
그리고 쓸데 없는 사족을 더 달아보면, 생성자에서 초기화 리스트를 사용하면 어떨까요?
CPUscheduleAL()
: pQueueReady_(NULL)
, pQueueRun_(NULL)
, pQueueNotYet_(NULL)
, pQueueWait_(NULL)
, pQueueHalt_(NULL)
, TSC_(0)
, nowIo_(0)
{}
일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.
쌀밥님. 답변감사합니다.많이 배웠습니다. :D
쌀밥님. 답변감사합니다.
많이 배웠습니다. :D
poklog at http://poksion.cafe24.com/poklog/
댓글 달기