C++ 导致内存泄漏的wchar\u t的返回数组

C++ 导致内存泄漏的wchar\u t的返回数组,c++,json,memory-leaks,free,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[25

我正在尝试从输入数组生成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;
}
wchar\u t*setExpectedTabData(\u在PCWSTR选项卡URL[]中,\u在PCWSTR选项卡标题[]中,\u在UINT选项卡中)
{
wchar_t*tabsDataJSON=新的wchar_t[JSONTABDATASIZE],jsonPerTab[256];
StringCchPrintf(tabsDataJSON,JSONTABDATASIZE,L“\”选项卡\“:[”;
bool isActiveTab=true;

对于(inti=1;i您的关注是正确的。当您使用new时,您就有责任在正确的时间调用delete

最好的解决方案可能是使用
std::unique\u ptr
。创建它的指针将根据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;
}
std::unique_ptr setExpectedTabData(_在PCWSTR选项卡URL[]中,_在PCWSTR选项卡标题[]中,_在UINT选项卡中)
{
//wchar_t*tabsDataJSON=新的wchar_t[JSONTABDATASIZE],jsonPerTab[256];
std::uniqueptrtabsdatajson{new wchar_t[JSONTABDATASIZE]};
wchar_t jsonPerTab[256];
StringCchPrintf(tabsDataJSON.get(),JSONTABDATASIZE,L“\”tabs\”:[”;
bool isActiveTab=true;

对于(int i=1;当你完成它时,我删除它。我不确定如何做同样的事情。我有没有什么东西可以像最后一样在哪里清理,在返回值后为什么不使用一个<代码> STD::WScING/<代码>,不用担心?我不知道这是什么语言,但它不是C++……笑话,只是我们。e std::vector。@jetty这就是我想要的。一旦你处理完返回的指针,你就删除它。不过我会按照Joachim Pileborg的建议,只使用
std::wstring
。这个空闲内存会分配给tabsDataJSON吗?我做java程序员太久了。我正在调用SetExpectedTabsData(…)。如何访问函数的局部变量tabsDataJSON?wchar_t*tabsDataJSON=setExpectedTabData(tabUrls、tabTitles、tabscont);重点是:)@Seb:谢谢……我觉得我有点太懒了。。。
    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;
}
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;
}