我有一个相当大的应用程序,它使用了许多线程(boost)、opencv、opengl 和 qt。
我开始遇到 boost::shared_ptr<> 对象之一的问题。
在应用程序的某些执行中,并非总是如此,boost::shared_ptr 指针用于指向无效位置,从而导致读取该位置的 UnhandledException。
由于这种行为不一致,我的猜测是 boost::shared_ptr 初始化存在某种问题。
这篇文章中的评论:Boost shared pointer initialization建议初始化列表是初始化 boost::shared_ptr 的推荐方式。Boost 的文档还说 make_shared 更快且异常安全。我正在使用 Boost 1.53.0。
按照该准则,我从构造函数中删除了初始化:
FrameObject::FrameObject(){
//initialization code
_contour = boost::make_shared<Contour>(); //Contour is a user defined object encapsulating a CvSeq* pointer.
并改用初始化列表:
FrameObject::FrameObject():
_contour(boost::make_shared<Contour>()){
//other initialization code
}
就目前而言,使用初始化列表显然已经解决了我的问题。但是由于 UnhandledException 并不总是被引发,我不确定使用初始化列表是否确实解决了我的问题。
编辑:它没有解决问题。异常最终确实出现了。