없어질 포인터로 받은 class 포인터 클래스로
글쓴이: wontop / 작성시간: 화, 2009/09/29 - 11:28오전
bool DataDic::Regist (DataInfo* data_info) { DATAINFO_ITER_T iter; iter = dic_.find(data_info->key()); if( iter != dic_.end()) { return false; } DataInfo* tmpDataInfo = new DataInfo; // 이부분에 보면 tmpDataInfo = data_info; // dic_[tmpDataInfo->key()] = tmpDataInfo; return true; }
class인 Data_info의 DATA(data_info)를 tmpDataInfo에 채워넣을려고 합니다.
어떻게 해야 하나요?
위와같이 포인터를 상속해서 주게 된다면 Regist의 파라미터로 받는(즉, 상위함수에서 넘겨준 포인터 정보가 사라진다면)
정보가 변경되었을경우, 아래서 new하므로써 메모리 할당을 받을 이유가 전혀 없지 않나요?
즉, 제가 구현하고자 하는건 데이터를 하나 하나 대입시켜 넘겨주는 방법 말고
포인터로 받은 class를 새로운 포인터 class에 이후에도 변하지 않도록 데이터를 입력하는 방법을 알고 싶습니다.
Forums:
질문을 파악하기가 여렵네요
일단 질문자께서 사용하시는 용어나 표현이 '객관적'이지 못합니다.
다만, 코드와 문장을 몇 번에 걸쳐 읽어본 결과 감을 약간 잡은 듯 하여
질문자께서 의도하시는 바를 '유추'해서 답변을 드려보겠습니다.
DataInfo* tmpDataInfo = new DataInfo;
// 이부분에 보면
tmpDataInfo = data_info;
//
dic_[tmpDataInfo->key()] = tmpDataInfo;
뭐가 되었건 STL container like한 dic_이라는 멤버가 DataInfo*를 저장하는 container라고 가정 할 때
위의 코드는
dic_[data_info->key()] = data_info;
와 전혀 다를 바 없고 data_info가 지워졌을 때 유효하지 않은 주소(객체)를 가르키고 있다는 질문이신 것
같습니다.
그리고 이에 대한 해결책은 간단합니다.
DataInfo* tmpDataInfo = new DataInfo;
// 객체를 할당(복사)하세요. 포인터를 할당하지 마시고.
*tmpDataInfo = *data_info;
//
dic_[tmpDataInfo->key()] = tmpDataInfo;
그리고 한 말씀 드리자면,
최초의 코드는 그 자체로 심각한 오류를 담고 있는 코드입니다(올려주신 코드에서 new DataInfo는
아무 쓸모 없이 버려지고 memory leak이 생기고 있습니다).
죄송하지만 님께 드리고 싶은 말은 자료구조 혹은 기본 C책을 먼저 보십시오. STL을 사용하거나 그 개념을
사용하는데 앞서 있는 것은 어찌됬건 C이고 C의 강력하지만 양날의 검인 메모리의 자유로운 접근과 제어 등은
개발자의 몫입니다.
그럼 이만...
댓글 달기