Flutter中创建不同初始化值的PixelMatching实例状态异常问题
问题排查与解决思路
1. 检查PixelMatching类的状态隔离逻辑
如果这个类的C实现或dart封装里用了静态全局变量存储源图像特征、OpenCV检测器这类核心数据,所有实例会共享同一份状态。比如C侧定义了全局的cv::Ptr<cv::ORB>检测器,每个实例创建时未重新初始化,那不管你创建多少个dart实例,实际都在复用同一份C++资源,自然会出现两个实例都用第一张图的情况。
2. 确认初始化时的图像参数确实不同
别只看代码路径,实际打印两个初始化时传入图像的哈希值、文件路径,确认传给两个实例的是不同图像。比如会不会不小心把同一张图的路径传给了第二个实例,或是图像加载失败后默认 fallback 到了第一张图。
3. 排查FFI绑定的对象创建逻辑
用FFI调用C时,每个dart实例必须对应C侧独立的对象实例:
- 如果C侧是单例实现,那不管你在dart里创建多少个实例,实际都指向同一个C对象,状态必然共享
- 检查dart侧的
PixelMatching构造函数,是否正确调用了C++的构造函数(比如通过allocate分配独立内存、调用new PixelMatching()),而非复用同一个指针
4. 验证调用时确实使用了不同实例
在调用两个实例的匹配方法时,打印实例的hashCode,确认每次调用的是不同对象。比如会不会是代码写错了,把第一个实例赋值给了第二个变量,导致两个变量指向同一个实例?
内容的提问来源于stack exchange,提问作者confumbit
相关产品推荐
相关产品推荐

