yolov5 c++推理onnx报错
auto outputTensors = session.Run(Ort::RunOptions{ nullptr }, inputNames.data(), &inputTensor, 1, outputNames.data(), 1); yolov5推理Onnx出现 inputNames字符含有烫烫烫,是乱码问题吗?
是的,你遇到的“烫烫烫”确实是典型的乱码问题。这通常不是ONNX Runtime或YOLOv5模型本身的问题,而是C++代码中的内存管理错误导致的。
🤔 为什么会出现“烫烫烫”?
“烫烫烫”是一个在中文开发者社区中广为人知的梗,它源于Visual Studio编译器在Debug模式下的一个特性:
- 内存填充:为了帮助开发者发现未初始化变量的错误,Visual Studio会在Debug模式下将栈(stack)上的未初始化内存填充为
0xCC。 - 字符映射:在GBK编码中,两个连续的
0xCC字节(即0xCCCC)恰好对应汉字“烫”。 - 乱码显示:因此,当你打印一段未初始化的内存时,就会看到一连串的“烫烫烫”。
💻 代码中的根本原因
在你的代码中,
inputNames 字符含有“烫烫烫”,说明 inputNames 数组中的字符串指针指向的内存是未初始化的。这通常发生在使用 Ort::Session::GetInputNameAllocated 方法时。GetInputNameAllocated 会返回一个 std::unique_ptr<char[]> 对象来管理内存。如果你直接将这个临时对象的 .get() 指针存入一个 std::vector<char*> 
// 1. 使用 std::vector<std::string> 来存储节点名称 std::vector<std::string> inputNodeNames; std::vector<const char*> inputNamesPtrs; // 2. 获取名称并复制到 vector 中 auto inputNameAllocated = session.GetInputNameAllocated(0, allocator); inputNodeNames.push_back(std::string(inputNameAllocated.get())); // 复制字符串内容 // 3. 将 std::string 的 C-style 字符串指针存入指针数组 inputNamesPtrs.push_back(inputNodeNames.back().c_str()); // 4. 运行推理 auto outputTensors = session.Run( Ort::RunOptions{ nullptr }, inputNamesPtrs.data(), &inputTensor, 1, outputNamesPtrs.data(), 1 );
欢迎讨论,相互学习。
cdtxw@foxmail.com

浙公网安备 33010602011771号