포트폴리오 만들기

10.map nilnode,begin,특수화 delete 수정 / FileManager / ScriptReader

Roka_is_back 2023. 12. 26.

1.Map nilnode , begin() 수정

공유 되는 nilnode  => 공유 안되는 nilnode

기존의 map은 nilnode가 static 이었다.

이렇게 하면 같은 Key,Value로 만든 map이 여러개인 경우, 같은 nilnode를 공유하기 때문에 문제가 발생한다.

소멸자에서 delete nilnode를 해주기 때문에 다른 rbt에서 접근할때 오류가 발생한다.

따라서 rbt 당 1개의 nilnode를 사용하도록 변경하였다.

begin() 함수 root가 nilnode인 경우 예외 처리

 

root 가 nilnode 인 경우 begin~ end로 이루어진 for문이 돌지 않아야 하기 때문에 이와 같은 예외처리를 해줘야 한다.

안그러면 begin != end 가 되기 때문에 operator++을 수행하게 되며 오류가 발생한다.

 

좀 더 안전하게 하기 위해서 MapIterator 생성자에도 예외처리를 해주었다.

rbt.h mapiterator 생성자

 

Pointer 특수화와  delete

기존은 value 에 대한 const char* 만 특수화 해주었다.

하지만 아래와 같이 경우의 수에도 동작하게 해야한다.

 

delete 를 다르게 처리해주어야 하는 부분이 3종류가 있다.

  • "Hello"와 같은 const char* 가 들어온 경우
  • new char[100]()와 같은 char* 가 들어온 경우
  • 일반 class,data 와 같은 normal*가 들어온 경우

char 는 2종류가 있다.

  • char
  • wchar_t

특수화 해줘야 하는 경우가 3종류가 있다.

  • Value * 인 경우
  • Key * 인 경우
  • Key * Value* 인 경우

따라서 아래와 같이 특수화 한 뒤 delete의 경우의 수를 체크해서 맞는 경우의 수의 delete를 수행하도록 했다.

특수화

 

key* value*

문제 없는지 테스트

기존 작성해둔 MapTestCode를 다시 수행하여
결과들이 달라졌는지, 수행 중 오류가 발생하는지 테스트 결과 문제 없이 작동했다.

또, 추가로 delete 에 관련된 테스트를 위한 코드를 추가했다.

mapTestCode

FileManager

생성자에서 path 경로들을 세팅해두게 했다.

FileManager 를 이용해서 기존에 짠 TimeStempTestCode를 변경한다.

주의할점은 string().c_str()은 임시 변수이기 때문에 호출한 당시에만 값이 유지된다.

entryPath = wstring().c_str();
M_FILE->GetFileExtension(entryPath);

만약 위와 같이 한다면 이미 날아간 문자열을 읽어서 제대로 동작하지 않는다.  

 

 

ScriptReader 

프로젝트 생성 및 lib 연결.

댓글