我正在尝试在 C++Builder 中运行 JSON。我一直在查看用于创建 JSON 文件的 Delphi 代码,它们似乎都创建了 JSON 文件/字符串的 Doc 和 Data 部分,但只释放了 Doc。
例如:
void __fastcall TMainForm::Panel1Click(TObject* Sender)
{
std::unique_ptr<TJSONObject> jsonDoc { new TJSONObject() };
TJSONObject* jsonData = new TJSONObject();
jsonDoc->AddPair("cmd", rdsNowPlaying);
jsonDoc->AddPair("station", "WBCB_FM");
jsonDoc->AddPair("data", jsonData);
jsonData->AddPair("testNull", new TJSONNull() );
jsonData->AddPair("testTrue", new TJSONBool(true) );
jsonData->AddPair("testFalse", new TJSONBool(false) );
Memo1->Lines->Text = jsonDoc->Format(3);
}
是否将jsonDoc->AddPair("data", jsonData);
的“所有权”赋予?那么,当被释放时,也被释放了吗?jsonData
jsonDoc
jsonDoc
jsonData
是否将jsonData->AddPair("testTrue", new TJSONBool(true) );
的所有权分配给并且何时释放它?TJSONBool
jsonData
jsonData
触发OnClick
事件显示正确,但这是另一个“如何释放(删除)内存”问题?还是std::unique_ptr
它TJSONObject
自己就能搞定?
psrdsNowPlaying
是enum
在标题中声明的。
默认情况下,顶级 JSON 值拥有其层次结构中的所有子对象。因此,释放
jsonDoc
将释放其中的所有内容。如果您想自己拥有某些东西的所有权,您可以手动设置 JSON 值的
Owned
属性。false
更新:
话虽如此,在您的特定代码示例中,
AddPair()
可能会引发异常,如果在调用new
其中一个参数时发生这种情况,您将在获得new
该对象的所有权之前泄漏该对象jsonDoc
。如果您要new
直接访问某个对象,请确保delete
在无法转移其所有权的情况下访问它。unique_ptr
可以帮助您,例如:对于布尔值(以及整数和字符串),您可以使用
AddPair()
为您创建 JSON 对象的重载(不幸的是,没有方法可以TJSONNull
为您创建),例如: