2014-03-04 2 views
1

Visual Studio 2013에서 C++ dll을 쓰고 있습니다. dll은 ini 파일에서 매개 변수를 읽어야합니다. 그래서이 목적을 위해 함수를 만들었습니다 (ReadConnectionSettings()). 내 정적 변수 serverIP는 함수가 작동하는 동안 적절하게 값을 가져 오지만 변수 (serverIP)를 실행하는 함수가 값을 잃으면 제대로 작동합니다. 무슨 문제가있는 것 같습니까?정적 LPTSTR 변수가 함수 실행 후 값을 잃습니다.

static LPTSTR serverIP = _TEXT(""); 

void ReadConnectionSettings() 
{ 
    TCHAR url[256]; 

    GetPrivateProfileString(_T("Connection"), _T("Url"), _T(""), url, 256, NameOfIniFile); 

    serverIP = url; 

} 
+0

'url'은 스택에 할당되고, 메소드가 끝나면 날아가 버립니다. 영구 저장 장치가 더 필요하면 영구 저장 장치 위치가 필요합니다. – dlev

+2

'url'은 로컬에 할당 된 변수이므로 ReadConnectionSettings가 반환 된 후에 해제되므로 serverIP는 해제 된 메모리를 가리 킵니다. 시도해보십시오 :'serverIP = _tcsdup (url);'행운을 빈다. 끝내면 기억을 풀어주는 것을 잊지 마라! –

답변

5

당신은 스택 메모리 url에서 포인터 serverIP을 가리키고있다.

함수가 종료 될 때 범위를 벗어나므로 포인터가 쓰레기를 가리키고 있습니다.

당신이 할 수있는 일은 버퍼 대신 serverIP 버퍼를 만들고 을 URL에 복사하는 것입니다. 그렇다면 그것은 지속될 것입니다. 그런 다음

static TCHAR serverIP[256] = _TEXT(""); 

:

_tcsnccpy(serverIP, url, 255); 

또는 @DavidOtano 제안으로, 당신은 당신의 기존 serverip로 포인터를 유지할 수 및 사용 :

serverIP = _tcsdup(url); 

하지만 경우 이렇게하면 동적으로 메모리를 할당하므로 전화하는 것을 기억해야합니다.

free(serverIP); 

메모리 누출을 방지하기 위해 더 이상 필요하지 않은 경우.

+1

C++이기 때문에 원시 문자 버퍼 대신에'std :: wstring'을 사용할 수 있습니다 :'std :: wstring'은 메모리 할당과 할당 해제를 자동으로 처리하여 성가신 메모리 누수와 이중 삭제를 피합니다. Undefined 행동 등. 그러나 전역 변수는 Evil (TM)입니다. 그래서'std :: wstring' 전역 변수를 사용하는 대신 함수에서'std :: wstring'을 리턴합니다. –

+0

@ Cheersandhth.-Alf : 좋은 지적이며 +1을 답. 질문 태그는'C++ '이라고했지만, 내가 본 코드는 유니 코드 인식 C와 훨씬 더 비슷하게 보였으므로 적절하게 대답했습니다! 귀하의 대답은 C++ 세계에서 더 낫습니다. – Baldrick

3

함수가 반환 된 후에 더 이상 존재하지 않는 지역 변수를 가리 키도록 정적 포인터 변수를 설정하고 있습니다.

Windows 프로그램의 함수에서 문자열을 반환하는 좋은 방법은 std::wstring을 반환하는 것입니다.

시도해보십시오. 당신은 윈도우 9x에서 DLL을에서 MFC를 지원하려는 경우


LPTSTR_TEXT에 관해서 만이 필요합니다. 그럴까요? 그렇지 않다면, 마이크로 소프트의 어리 석음을 버리십시오.


(컴파일러의 손에 의해 훼손되지 않은 커프 오프) 위의 조언에 따라 고정 코드 :이 코드의

auto connection_settings() 
    -> std::wstring 
{ 
    std::wstring url(256, L'#'); 

    auto const n = GetPrivateProfileString(L"Connection", L"Url", L"", &url[0], url.size(), NameOfIniFile); 
    url.resize(n); 
    return url; 
} 

하나 개의 좋은 속성은 더 이상 전역 변수을 수정하는 것이 없다.