静态LPTSTR变量在函数执行后丢失值

时间:2014-03-04 06:00:13

标签: c++ function lptstr

我正在Visual Studio 2013上编写C ++ DLL。我的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;

}

2 个答案:

答案 0 :(得分:5)

您将指针serverIP指向堆栈内存url

当函数退出时,这超出了范围,所以你的指针指向垃圾。

您可以做的是使serverIP成为缓冲区,然后 URL复制到其中。然后它会坚持下去。

那是:

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

然后:

 _tcsnccpy(serverIP, url, 255);

或者@DavidOtano建议,您可以保留现有的serverIP指针,并使用:

 serverIP = _tcsdup(url);

但是如果你这样做,你就是动态分配内存,所以需要记住调用:

 free(serverIP);

当你不再需要它时,为了避免内存泄漏。

答案 1 :(得分:3)

您正在将静态指针变量设置为指向函数返回后不再存在的局部变量。

从Windows程序中的函数返回字符串的好方法是返回std::wstring

试试。


关于LPTSTR_TEXT,如果您打算在Windows 9x中的DLL中支持MFC,则只需要这个。是这样的吗?如果没有,就放弃微软的愚蠢。


根据上述建议修改的代码(在袖口之外,未经编译器的手触及):

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

此代码的一个不错的属性是它不再修改全局变量