使用nlohmann JSON转换JSON至含char*类型结构体的优化方案
替代方案
有几种更简洁的实现方式,同时要注意跨DLL场景下的内存管理一致性(必须用同一堆分配/释放,比如导出DLL中的内存释放函数):
用
std::strdup简化代码std::strdup会自动分配足够内存并完成字符串复制,省去手动计算长度和调用strcpy的步骤,一行代码就能搞定:p.value_one = std::strdup(j.at("value1").get<std::string>().c_str());注意:
std::strdup在C++17被纳入标准,若使用旧标准,Windows下可改用_strdup,需确认编译器支持。直接引用JSON字符串减少拷贝
可以直接获取JSON中字符串的引用,避免创建临时std::string变量,效率略高:const auto& str = j.at("value1").get_ref<const std::string&>(); p.value_one = new char[str.size() + 1]; std::copy(str.begin(), str.end(), p.value_one); p.value_one[str.size()] = '\0';
关键注意事项
- 跨编译器DLL传递
char*时,绝对不能让调用方用delete或free释放内存,必须在DLL中导出专门的释放函数(比如void free_test_struct(test& p)),内部用对应的delete[](如果用new分配)或free(如果用strdup分配)来释放,避免堆不匹配导致崩溃。 - 结构体要确保是标准布局,最好显式指定对齐方式(比如
__declspec(align(4))),避免不同编译器对齐规则差异引发问题。
内容的提问来源于stack exchange,提问作者user2020
相关产品推荐
相关产品推荐

