2016-03-21 67 views
0

我试图设置需要在应用程序的另一个文件(层)中使用的数据。在调试过程中,我看到该值第一次正确设置。但是当我尝试在函数后面使用这个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; 
} 

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

+0

请问为什么这个questoin被拒绝投票? – jetty

回答

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_tabsDatam_tabsData = 0;

+0

我能做些什么避免它?如果我分配内存,我不确定何时释放它。 – jetty

+0

什么是'm_tabsData'?你如何定义它? – Ilya

+0

它是FakeCourier类的成员变量,类型为wchar_t * m_tabsData; – jetty