我尝试在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 *的分配来完成。你怎么看?或者还有其他更常见的方法来实现它吗?
答案 0 :(得分:2)
但这仍然是例外吗?
没有。如果作为string
的另一个参数传递的Add
的构造抛出,则动态对象可能被泄露。未指定首先创建哪个参数。
原始代码确保在发生任何其他事情之前将动态对象分配给智能指针:唯一可能失败的是创建智能指针本身,在这种情况下它将删除对象。
还有其他更常见的方法来实现这个吗?
使用make_shared
函数模板通常更好,而不是自己使用new
。它不仅可以通过永不暴露裸指针来保证异常安全,还可以通过在单个内存块中创建受控对象和共享引用计数来更有效地使用内存。
obj->Add(boost::make_shared<JSONNode>(), "firstElement"); // or std:: in C++11