bytedance / sonic-cpp

A fast JSON serializing & deserializing library, accelerated by SIMD.
Apache License 2.0
835 stars 101 forks source link

operator[]/AtPoiter返回的引用(指针)有bug? #87

Closed andy20170608 closed 7 months ago

andy20170608 commented 7 months ago

void fun3() { SONIC_DEFAULT_ALLOCATOR alloc; sonic_json::Node node, node1Inner, node2Inner;

node1Inner.SetObject();
node1Inner.AddMember("innerKey1", sonic_json::Node("innerValue1", alloc), alloc);

node2Inner.SetObject();
node2Inner.AddMember("innerKey2", sonic_json::Node("innerValue2", alloc), alloc);

node.SetObject();
node.AddMember("key1", std::move(node1Inner), alloc);
node.AddMember("key2", std::move(node2Inner), alloc);

printf("js:%s\n", node.Dump().c_str());

auto & nRef = node["key2"];
node.RemoveMember("key1");

//这行代码不能执行,抛异常显示nRef不是一个Object?
nRef.AddMember("newKey", sonic_json::Node("newValue", alloc), alloc);

}

我看了代码RemoveMember底下会修改DNode的位置,导致nRef引用的DNode已经不是当前有效的地址了?类似的操作std::map是支持的吧?

xiegx94 commented 7 months ago

sonic 中的 object 并不是以树的方式组织的,而是一个 kv 对组成的数组。删除某个 key 的时候,做法是将尾端的数据和删除的数据做交换。因此,RemoveMember 会导致之前获得的引用、迭代器全部失效。

andy20170608 commented 7 months ago

ok,知道了。