Expression: public_stream != nullptr

本文探讨了FFmpeg在使用过程中出现的空指针异常问题,并详细分析了导致此问题的原因,包括文件不存在或流为空等情况。通过阅读本文,读者可以了解到如何排查和解决此类错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Microsoft Visual C++ Runtime Library
---------------------------
Debug Assertion Failed!


Program: D:\project\c++\ffmpeg_3.4-64\ffmpeg_02\x64\Debug\ffmpeg_02.exe
File: minkernel\crts\ucrt\src\appcrt\stdio\feoferr.cpp
Line: 17


Expression: public_stream != nullptr


For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.


(Press Retry to debug the application)


其实就是ffmpeg的空指针异常,这里是说数据流为空,原因有文件不存在、流为空等等

#include "Parser.h" #include <algorithm> #include <stdexcept> #include <sstream> #include <iostream> #include"SingleNode.h" #include"Context.h" #include"IfNode.h" #include"ThenNode.h" #include"WhenNode.h" #include"AndNode.h" #include"NotNode.h" #include"OrNode.h" using namespace std; unique_ptr<ExpressionNode> Parser::parse(const string& expr) { string cleaned = trim(expr.substr(expr.find('(') + 1, expr.rfind(')') - expr.find('(') - 1)); return parseExpression(cleaned); } unique_ptr<ExpressionNode> Parser::parseSingleNode(const string& expr) { if (expr.find("THEN(") != 0 && expr.find("IF(") != 0 && expr.find("WHEN(") != 0 && expr.find("AND(") != 0 && expr.find("OR(") != 0 && expr.find("NOT(") != 0) { return make_unique<SingleNode>(expr); } return parseExpression(expr); } unique_ptr<ExpressionNode> Parser::parseIfExpression(const string& expr) { size_t comma1 = findMatchingBracket(expr, 0); string conditionStr = trim(expr.substr(0, comma1)); size_t comma2 = findMatchingBracket(expr, comma1 + 1); string thenPart = trim(expr.substr(comma1 + 1, comma2 - comma1 - 1)); string elsePart = trim(expr.substr(comma2 + 1)); auto conditionNode = parseLogicalExpression(conditionStr); auto thenNode = parseExpression(thenPart); unique_ptr<ExpressionNode> elseNode = nullptr; if (!elsePart.empty()) { elseNode = parseExpression(elsePart); } return make_unique<IfNode>( move(conditionNode), move(thenNode), move(elseNode) ); } unique_ptr<ExpressionNode> Parser::parseThenExpression(const string& expr) { vector<unique_ptr<ExpressionNode>> children; size_t pos = 0; while (pos < expr.size()) { size_t end = findMatchingBracket(expr, pos); string item = expr.substr(pos, end - pos); children.push_back(parseExpression(trim(item))); pos = (end == string::npos) ? expr.size() : end + 1; } return make_unique<ThenNode>(move(children)); } unique_ptr<ExpressionNode> Parser::parseWhenExpression(const string& expr) { vector<unique_ptr<ExpressionNode>> children; auto parts = splitComponents(expr); for (const auto& part : parts) { children.push_back(parseExpression(trim(part))); } return make_unique<WhenNode>(move(children)); } vector<string> Parser::splitComponents(const string& expr) { vector<string> parts; int bracketCount = 0; size_t start = 0; for (size_t i = 0; i < expr.size(); ++i) { char c = expr[i]; if (c == '(') { bracketCount++; } else if (c == ')') { bracketCount--; } else if (c == ',' && bracketCount == 0) { string part = expr.substr(start, i - start); parts.push_back(trim(part)); start = i + 1; } } if (start < expr.size()) { string lastPart = expr.substr(start); parts.push_back(trim(lastPart)); } return parts; } unique_ptr<ExpressionNode> Parser::parseExpression(const string& expr) { try { string trimmed = trim(expr); if (trimmed.empty()) { throw runtime_error("Empty expression"); } if (startsWith(trimmed, "THEN(")) { return parseThenExpression(trimmed.substr(5, trimmed.size() - 6)); } if (startsWith(trimmed, "IF(")) { return parseIfExpression(trimmed.substr(3, trimmed.size() - 4)); } if (startsWith(trimmed, "WHEN(") || startsWith(trimmed, "PAR(")) { return parseWhenExpression(trimmed.substr(5, trimmed.size() - 6)); } if (startsWith(trimmed, "AND(")) { return parseAndExpression(trimmed.substr(4, trimmed.size() - 5)); } if (startsWith(trimmed, "OR(")) { return parseOrExpression(trimmed.substr(3, trimmed.size() - 4)); } if (startsWith(trimmed, "NOT(")) { return parseNotExpression(trimmed.substr(4, trimmed.size() - 5)); } return parseSingleNode(trimmed); } catch (const exception& e) { cerr << "Parse EL error: " << e.what() << endl; throw; } } // 新增逻辑表达式解析方法 unique_ptr<ExpressionNode> Parser::parseLogicalExpression(const string& expr) { string trimmed = trim(expr); if (startsWith(trimmed, "AND(")) { return parseAndExpression(trimmed.substr(4, trimmed.size() - 5)); } if (startsWith(trimmed, "OR(")) { return parseOrExpression(trimmed.substr(3, trimmed.size() - 4)); } if (startsWith(trimmed, "NOT(")) { return parseNotExpression(trimmed.substr(4, trimmed.size() - 5)); } return parseSingleNode(trimmed); } unique_ptr<ExpressionNode> Parser::parseAndExpression(const string& expr) { auto parts = splitComponents(expr); vector<unique_ptr<ExpressionNode>> children; for (const auto& part : parts) { children.push_back(parseLogicalExpression(trim(part))); } return make_unique<AndNode>(move(children)); } unique_ptr<ExpressionNode> Parser::parseOrExpression(const string& expr) { auto parts = splitComponents(expr); vector<unique_ptr<ExpressionNode>> children; for (const auto& part : parts) { children.push_back(parseLogicalExpression(trim(part))); } return make_unique<OrNode>(move(children)); } unique_ptr<ExpressionNode> Parser::parseNotExpression(const string& expr) { // 确保NOT表达式只有一个参数 auto parts = splitComponents(expr); if (parts.size() != 1) { throw runtime_error("NOT expression requires exactly one argument"); } return make_unique<NotNode>(parseLogicalExpression(trim(parts[0]))); } // 辅助函数 bool Parser::startsWith(const string& str, const string& prefix) { return str.compare(0, prefix.length(), prefix) == 0; } size_t Parser::findMatchingBracket(const string& expr, size_t start) { int balance = 0; for (size_t i = start; i < expr.size(); ++i) { if (expr[i] == '(') balance++; else if (expr[i] == ')') balance--; else if (expr[i] == ',' && balance == 0) { return i; } } return string::npos; } string Parser::trim(const string& s) { size_t start = s.find_first_not_of(" \t\n\r"); size_t end = s.find_last_not_of(" \t\n\r"); return (start == string::npos) ? "" : s.substr(start, end - start + 1); }报错
07-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值