[英]Return array of wchar_t causing memory leak
我試圖從我的輸入數組生成一個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_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;
}
你是對的。 當您使用new時,您已承擔在適當的時間調用delete的責任。
最好的解決方案可能是使用std::unique_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;
}
然后它會移出到主程序中的變量:
int main()
{
std::unique_ptr<wchar_t[]> tabsDataJSON = SetExpectedTabsData(tabUrls, tabTitles, tabsCount);
//do something with tabsDataJSON
//..
//no need to remember delete[]
return 1;
}
還要記住,您可能希望在某個時刻將此指針的“普通”版本傳遞給另一個函數。 在這種情況下,您可以調用some_function_that_uses_plain_array_pointer(tabsDataJSON.get());
。 或者,如果您想要將指針“手動控制”到一個只知道普通指針的函數,並且希望為您調用delete,那么您可以使用some_function_that_releases_plain_array_pointer(tabsDataJSON.release());
。
// call function
wchar_t* mystr = SetExpectedTabsData(...);
// use mystr
// delete it
delete [] mystr;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.