2016-03-21 18 views
0

アプリケーションの別のファイル(レイヤー)で使用する必要のあるデータを設定しようとしています。デバッグ中に、私は値が最初に正しく設定されることを確認します。しかし、関数の後でこの集合変数を使用しようとすると、値が変更されます。メモリが解放されて変数がリセットされると思います。誰でも私がやろうとしていることで私を助けてください。機能の終了後に値が変更される

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

このクエストインがダウンした理由を教えてください。 – 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_tabsDataを初期化する(m_tabsData = 0;

+0

私はそれを避けることができますか?私がメモリを割り当てる場合、私はいつそれを解放するのか分からない。 – jetty

+0

'm_tabsData'とは何ですか?どのように定義しますか? – Ilya

+0

これは、wchar_t * m_tabsData型のFakeCourierクラスに対するメンバ変数です。 – jetty

関連する問題