功能结束后价值变化

时间:2016-03-21 06:11:22

标签: c++ memory local-variables

我正在尝试设置需要在应用程序的另一个文件(层)中使用的数据。在调试过程中,我看到第一次正确设置了值。但是当我尝试在函数之后使用此set变量时,值会更改。我认为内存被释放导致变量重置。任何人都可以帮助我解决我想做的事情。

void SetExpectedTabsData(_In_ PCWSTR tabUrls[], _In_ PCWSTR tabTitles[], _In_ UINT tabsCount, _In_ FakeCourier* courier)
{
    wchar_t jsonPerTab[256];
    wchar_t tabsDataJSON[c_jsonTabDataSize];
    // tabsDataJSON should be large enough to hold any data.
    StringCchPrintf(tabsDataJSON, c_jsonTabDataSize, L"\"tabs\":[");
    bool isActiveTab = true;
    // tabId starts from 1 and the tabIndex starts with 0. Manipulated the json string generation accordingly.
    for (unsigned int i = 1; i <= tabsCount; ++i)
    {
        StringCchPrintf(jsonPerTab, ARRAYSIZE(jsonPerTab), L"{\"id\":%i,\"index\":%i,\"windowId\":1,\"active\":%s,\"status\":\"complete\",\"title\":\"%s\",\"url\":\"%s\"}", i, (i - 1), isActiveTab ? L"true" : L"false", tabTitles[i - 1], tabUrls[i - 1]);
        StringCchCat(tabsDataJSON, c_jsonTabDataSize, jsonPerTab);
        isActiveTab = false;
        if (i != tabsCount)
        {
            StringCchCat(tabsDataJSON, c_jsonTabDataSize, L",");
        }
    }
    StringCchCat(tabsDataJSON, c_jsonTabDataSize, L"],");
    VERIFY_SUCCEEDED(courier->SetExpectedTabsData(tabsDataJSON));
}

需要设置数据的快递文件为

HRESULT FakeCourier::SetExpectedTabsData(_In_ wchar_t* tabsData)
{
  m_tabsData = tabsData;
  return S_OK;
}

请建议正确的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

变量tabsDataJSON在函数SetExpectedTabsData中是局部的,因此在完成此函数后可以覆盖它。并且因为它可能发生,它会发生。

当您调用FakeCourier::SetExpectedTabsData(tabsDataJSON)时,此函数只会记住指向该局部变量tabsDataJSON的指针。但在完成函数SetExpectedTabsData之后,此指针变为无效。

要修复它,您需要修改函数FakeCourier::SetExpectedTabsData:替换指针的复制是复制指向的数据。由于您的m_tabsDatawchar_t*,因此只需分配此字符串并将数据从tabsData复制到m_tabsData(阅读wcsncpy及类似函数)。

尝试这样的事情:

HRESULT FakeCourier::SetExpectedTabsData(_In_ wchar_t* tabsData)
{
  const size_t len = wcslen(tabsData);
  if (m_tabsData)
    delete m_tabsData;
  m_tabsData = new wchar_t[len + 1];
  wcsncpy(m_tabsData, tabsData, len + 1);
  return S_OK;
}

而且你还需要在FakeCourier的析构函数中释放这个内存(以避免内存泄漏)。并在构造函数(m_tabsData

中初始化m_tabsData = 0;