返回导致内存泄漏的wchar_t数组

时间:2016-03-14 14:46:16

标签: c++ json memory-leaks free

我正在尝试从输入数组生成JSON字符串。我使用“new”来为这个JSON分配内存。但是我不知道在哪里释放这个内存或者是否有更好的方法来编写这个函数。

    wchar_t*  SetExpectedTabsData(_In_ PCWSTR tabUrls[], _In_ PCWSTR tabTitles[], _In_ UINT tabsCount)
{
    wchar_t* tabsDataJSON = new wchar_t[JSONTABDATASIZE], jsonPerTab[256];
    StringCchPrintf(tabsDataJSON, JSONTABDATASIZE, L"\"tabs\":[");
    bool isActiveTab = true;
    for (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, JSONTABDATASIZE, jsonPerTab);
        isActiveTab = false;
        if (i != tabsCount)
        {
            StringCchCat(tabsDataJSON, JSONTABDATASIZE, L",");
        }
    }
    StringCchCat(tabsDataJSON, JSONTABDATASIZE, L"],");
    return tabsDataJSON;
}

请建议。

3 个答案:

答案 0 :(得分:1)

    wchar_t*  SetExpectedTabsData(_In_ PCWSTR tabUrls[], _In_ PCWSTR tabTitles[], _In_ UINT tabsCount)
{
    wchar_t* tabsDataJSON = new wchar_t[JSONTABDATASIZE], jsonPerTab[256];
    StringCchPrintf(tabsDataJSON, JSONTABDATASIZE, L"\"tabs\":[");
    bool isActiveTab = true;
    for (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, JSONTABDATASIZE, jsonPerTab);
        isActiveTab = false;
        if (i != tabsCount)
        {
            StringCchCat(tabsDataJSON, JSONTABDATASIZE, L",");
        }
    }
    StringCchCat(tabsDataJSON, JSONTABDATASIZE, L"],");
    return tabsDataJSON;
}

以主要为例:

int main()
{
    wchar_t* tabsDataJSON = SetExpectedTabsData(tabUrls, tabTitles, tabsCount);
    //do something with tabsDataJSON
    //..

    //end of scope of tabsDataJSON
    //DONT FORGET TO DELETE IT ON THE RIGHT POINT IF YOU DONT NEED IT ANYMORE
    delete[] tabsDataJSON;
    return 1;
}

答案 1 :(得分:1)

你是对的。当您使用new时,您已承担在适当的时间调用delete的责任。

最好的解决方案可能是使用std::unique_ptr。创建它的指针can be moved out of the function,当它超出范围时,它将根据RAII原则自动删除和释放。

在函数中创建std::unique_ptr

std::unique_ptr<wchar_t[]>  SetExpectedTabsData(_In_ PCWSTR tabUrls[],_In_ PCWSTR tabTitles[],_In_ UINT tabsCount)
{
    //wchar_t* tabsDataJSON = new wchar_t[JSONTABDATASIZE],jsonPerTab[256];
    std::unique_ptr<wchar_t[]> tabsDataJSON{new wchar_t[JSONTABDATASIZE]};
    wchar_t jsonPerTab[256];
    StringCchPrintf(tabsDataJSON.get(),JSONTABDATASIZE,L"\"tabs\":[");
    bool isActiveTab = true;
    for (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.get(),JSONTABDATASIZE,jsonPerTab);
        isActiveTab = false;
        if (i != tabsCount) {
            StringCchCat(tabsDataJSON.get(),JSONTABDATASIZE,L",");
        }
    }
    StringCchCat(tabsDataJSON.get(),JSONTABDATASIZE,L"],");
    return tabsDataJSON;
}

然后它被移出到主程序中的变量:

int main()
{
    std::unique_ptr<wchar_t[]> tabsDataJSON = SetExpectedTabsData(tabUrls, tabTitles, tabsCount);
    //do something with tabsDataJSON
    //..

    //no need to remember delete[]
    return 1;
}

另请注意,您可能希望通过&#34;普通&#34;在某些时候指向另一个函数的指针的版本。在这种情况下,您可以致电some_function_that_uses_plain_array_pointer(tabsDataJSON.get());。或者,如果你想要&#34;交回控制&#34;指向一个只知道普通指针的函数的指针,以及希望为你调用delete的函数,然后你可以使用some_function_that_releases_plain_array_pointer(tabsDataJSON.release());

答案 2 :(得分:0)

// call function
wchar_t* mystr = SetExpectedTabsData(...);
// use mystr
// delete it
delete [] mystr;