time_t tmNowtime;
 tm *pNowTime;

 

 tmNowtime = time(NULL);

 pNowTime = localtime(&tmNowtime);

 

 time_t tmLogOut;
 tm *pLogOutTime;

 

 tmLogOut = dwLogOutTime;

 pLogOutTime = localtime(&tmLogOut);

 


>> 위와 같이 localtime() 함수를 호출 시 pNowTime의 값이 pLogOutTime값으로 무조건 변경되는 문제가 발생

 

localtime()는 날짜와 시간을 저장하고 있는 tm 구조체를 반환하는데, 절대 반환받은 포인터를 해제해서는 안됩니다. 시간 라이브러리에서 공유하고 있는 메모리이기 때문에 해제할 때의 결과는 어떻게 될지 알 수 없습니다. 직접 할당한 메모리가 아니기 때문에 해제할 생각을 하지 말아야 합니다.

 

메모리를 공유하기 때문에 발생하는 문제가 있습니다. localtime() 호출은 같은 위치에 결과를 계속적으로 저장합니다. 사용자가 제공한 버퍼라면 매번 다른 위치에 기록할 수 있겠지만, 버퍼 하나만을 가지고 재활용하기 때문에 이전 결과는 사라집니다. 이것이 잘못된 동작은 아니지만 이전 시간을 저장해서 나중 시간과 비교하는 용도로 사용하려고 하면 문제가 됩니다. localtime()를 연속해서 호출하면 이전에 호출했던 모든 localtime() 호출의 결과는 사라집니다. 마지막에 호출했던 결과만 남습니다.


이런 그지같은 M$

 

포인터로 안받고 직접 tm변수로 선언해서 memcpy하면 해결되긴 한다.

 

하지만 많이 찝찝하다.

 

 time_t tmNowtime;
 tm pNowTime;

 

 tmNowtime = time(NULL);

 memcpy(pNowTime, localtime(&tmNowtime), sizeof(tm));

 

 time_t tmLogOut;
 tm *pLogOutTime;

 

 tmLogOut = dwLogOutTime;

 pLogOutTime = localtime(&tmLogOut);

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스

댓글을 달아 주세요