_TCHAR buf[1024];
가 지역 변수로 선언되었기 때문인것 같습니다.
당연히 지역 변수는 함수가 종료됨과 동시에 스텍에서 사라지니
buf를 가져다 쓰는 다른 포인터 변수의 값들도 사라지는 것이겠죠.
낭천 님이 쓰신 글 :
: c++로 프로젝트의 파일패스를 추출해서 문자열에넣고 그걸 이용해서 처리를 하려는데...정말 이상한점이 있습니다.
: 문자열 변수에 넣었을때 잘 들어가나 싶은데 메소드를 빠저나가거나..try문안에서 실행했을때 try를 빠저나가면 패스를 넣었던 문자열이 비어버립니다.
:
: IniFileController::IniFileController()
: {
: numOfServer = "NumberOfServer";
: section = "AP_SERVER";
: fileName = "AP_SERVER_LIST.ini";
:
: _TCHAR* splitBuf;
: _TCHAR* splitContxt;
: CString exeName;
: CString projectPath;
:
: _TCHAR buf[1024];
: GetModuleFileName(0,buf,1024);
:
: projectPath = buf;
: splitBuf = buf;
: splitBuf = strtok_s(buf, "\\", &splitContxt);
: while(strtok_s(NULL, "\\", &splitContxt) != NULL)
: {
: splitBuf = strtok_s(NULL, "\\", &splitContxt);
: }
: exeName = splitBuf;
: projectPath.Replace(exeName, fileName);
:
: iniPath = projectPath;
: }
: 컨스트럭터에서 iniPath에 습득한 문자열을 넣었습니다. iniPath는 LPCTSTR형이고 h파일에서 정의했습니다.
: 마지막줄의 iniPath = projectPath; 를 보면 iniPath에 값이 잘 들어가 있는데 그 다음 줄의 } 에 가면
: iniPath에 잘못된 문자가 들어있습니다 어쩌고 저쩌고 합니다...
:
: 그리고 위의 컨스트럭터 아래에 다음 메소드가 있습니다.
:
:
: bool IniFileController::GetNumServer()
: {
: //設定ファイルのNumberOfServer取得
: try
: {
: //iniファイルの存在を確認する
: if(!fileChecker.GetFileExists(iniPath))
: {
: LPCTSTR err = "設定ファイルがモジュールと同じ場所に存在しません。\n";
: throw err;
: }
: }
: catch(LPCTSTR err)
: {
: std::cout << err;
: return false;
: }
: return true;
: }
:
:
: 여기서 iniPath를 사용하는데요...컨스트럭터에서 마지막에 이상한게 들어갔기때문에 역시나 여기서도 이상한게 들어가있는 그대로입니다...컨스트럭터에 하고있는 iniPath에 값 넣는 처리를 그대로 컨스트럭터가 아닌 다른 메소드에서 실행하거나 해도 같은 현상이 일어납니다.
:
: 아래와 같이 할 경우에는 원하는 처리를 얻을 수 있기는 합니다..
:
:
: bool IniFileController::GetNumServer()
: {
: //設定ファイルのNumberOfServer取得
: try
: {
: _TCHAR* splitBuf;
: _TCHAR* splitContxt;
: CString exeName;
: CString projectPath;
:
: _TCHAR buf[1024];
: GetModuleFileName(0,buf,1024);
:
: projectPath = buf;
: splitBuf = buf;
: splitBuf = strtok_s(buf, "\\", &splitContxt);
: while(strtok_s(NULL, "\\", &splitContxt) != NULL)
: {
: splitBuf = strtok_s(NULL, "\\", &splitContxt);
: }
: exeName = splitBuf;
: projectPath.Replace(exeName, fileName);
:
: iniPath = projectPath;
: //iniファイルの存在を確認する
: if(!fileChecker.GetFileExists(iniPath))
: {
: LPCTSTR err = "設定ファイルがモジュールと同じ場所に存在しません。\n";
: throw err;
: }
: }
: catch(LPCTSTR err)
: {
: std::cout << err;
: return false;
: }
: return true;
: }
:
:
: 이렇게 할경우 iniPath를 습득해서 바로 쓰기때문에 뭐..일단 정상적으로 되긴합니다만...이 현상이 이해가 안갑니다..
: 나름 변수를 포인터로도 바꿔보고 해봤는데 해결이 안되네요...도대체 왜이러는 걸까요..ㅠ