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模式下的一个特性:
  1. 内存填充:为了帮助开发者发现未初始化变量的错误,Visual Studio会在Debug模式下将栈(stack)上的未初始化内存填充为 0xCC
  2. 字符映射:在GBK编码中,两个连续的 0xCC 字节(即 0xCCCC)恰好对应汉字“烫”。
  3. 乱码显示:因此,当你打印一段未初始化的内存时,就会看到一连串的“烫烫烫”。

💻 代码中的根本原因

在你的代码中,inputNames 字符含有“烫烫烫”,说明 inputNames 数组中的字符串指针指向的内存是未初始化的。这通常发生在使用 Ort::Session::GetInputNameAllocated 方法时。
GetInputNameAllocated 会返回一个 std::unique_ptr<char[]> 对象来管理内存。如果你直接将这个临时对象的 .get() 指针存入一个 std::vector<char*> 

image

 

// 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
);

 

posted @ 2026-04-23 10:22  txwtech  阅读(2)  评论(0)    收藏  举报