2

我尝试在 C++ 中实现 JSON 框架,并希望利用多态概念。我有一个类JSONNode,它是一种存储其他 JSONNode 对象本身的容器,依此类推。我正在使用指针和动态分配来做到这一点。为了异常安全,我不想使用new/delete但使用 boost 共享指针。将元素(进一步的 json 对象)添加到 json 对象的基本场景如下所示:

typedef boost::shared_ptr<JSONNode> JSONNodePtr;   

void JSONNode::Add(JSONNodePtr nodePtr, const std::string& name)
{
    this->elements[name] = nodePtr;  // store in STL std::map
}

// create and add json object 
JSONNodePtr obj(new JSONNode());
JSONNodePtr element(new JSONNode());
obj->Add(element, "firstElement");

为了更容易使用,我宁愿不显式分配element并将共享指针的创建放入类方法中Add

void JSONNode::Add(JSONNode* node, const std::string& name)
{
    JSONNodePtr nodePtr(node);
    this->elements[name] = nodePtr;
}

// create and add json object 
...
obj->Add(new JSONNode, "firstElement");    

但这仍然是异常安全的吗?我猜不是因为共享指针的创建不是通过 JSONNode* 的分配立即完成的。你怎么看?还是有其他更常见的方法来实现这一点?

4

1 回答 1

2

但这仍然是异常安全的吗?

不会。如果 to 的构造string作为另一个参数传递给Addthrows,则动态对象可能会泄漏。未指定首先创建哪个参数。

原始代码确保在其他任何事情发生之前将动态对象分配给智能指针:唯一可能失败的是智能指针本身的创建,在这种情况下它将删除对象。

还是有其他更常见的方法来实现这一点?

使用函数模板通常make_shared比使用new自己更好。它不仅通过从不暴露裸指针来保证异常安全,而且还通过在单个内存块中创建受控对象和共享引用计数来更有效地使用内存。

obj->Add(boost::make_shared<JSONNode>(), "firstElement"); // or std:: in C++11
于 2013-09-06T15:04:04.303 回答