статическая переменная LPTSTR теряет значение после выполнения функции

Я пишу C ++ DLL на Visual Studio 2013. Моя DLL должна читать параметры из INI-файла. Итак, я создал функцию для этой цели (ReadConnectionSettings ()). Моя статическая переменная serverIP получает значение должным образом во время работы функции, однако, как только функция завершает выполнение переменной (serverIP) теряет свое значение. В чем проблема?

static LPTSTR   serverIP = _TEXT("");

void ReadConnectionSettings()
{
TCHAR url[256];

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

serverIP = url;

}

1

Решение

Вы указываете указатель serverIP в памяти стека url,

Это выходит из области видимости при выходе из функции, поэтому ваш указатель остается указанным на мусор.

Что вы могли бы сделать, это сделать serverIP вместо этого буфер и копия URL в него. Тогда это будет продолжаться.

То есть:

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

Затем:

 _tcsnccpy(serverIP, url, 255);

Или, как предложил @DavidOtano, вы можете сохранить свой существующий указатель serverIP и использовать:

 serverIP = _tcsdup(url);

Но если вы сделаете это, вы динамически распределяете память, поэтому нужно будет не забыть вызвать:

 free(serverIP);

когда вам это больше не нужно, чтобы избежать утечки памяти.

5

Другие решения

Вы устанавливаете переменную статического указателя так, чтобы она указывала на локальную переменную, которая больше не существует после возврата функции.

Хороший способ вернуть строку из функции в программе Windows, это вернуть std::wstring,

Попробуй это.


относительно LPTSTR а также _TEXTЭто необходимо только в том случае, если вы намереваетесь поддерживать MFC в DLL в Windows 9x. Это тот случай? Если нет, просто откажитесь от этой глупости Microsoft.


Код исправлен в соответствии с приведенным выше советом (без манжеты, не тронутым руками компилятора):

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;
}

Хорошим свойством этого кода является то, что он больше не изменяет глобальная переменная.

3

По вопросам рекламы [email protected]