函数结束后得到值更改
问题描述:
我试图设置需要在应用程序的另一个文件(层)中使用的数据。在调试过程中,我看到该值第一次正确设置。但是当我尝试在函数后面使用这个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;
}
请建议正确的方法来做到这一点。
答
变量tabsDataJSON
在功能SetExpectedTabsData
中是本地的,所以在完成此功能后可以覆盖它。既然可以发生,它就会发生。
当您拨打FakeCourier::SetExpectedTabsData(tabsDataJSON)
时,此功能只记得指向本地变量tabsDataJSON
的指针。但是,在完成功能SetExpectedTabsData
后,该指针变为无效。
要修复它,您需要修改功能FakeCourier::SetExpectedTabsData
:替换指针复制指针数据的拷贝。由于您的m_tabsData
是wchar_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;
)
请问为什么这个questoin被拒绝投票? – jetty