За this ROS wiki article, toCvShare()
возвращает CvImageConstPtr
, который является typedef для boost::shared_ptr<CvImage const>
.
В случае:
recivedRosImage = &(cv_bridge::toCvShare(msg, "bgr8")->image);
.. Для boost::shared_ptr<CvImage const>
возвращенный toCvShare()
называется временный объект. В C++ временные объекты уничтожаются как последний шаг при оценке полного выражения, которое лексически содержит точку, в которой они были созданы (см. Раздел [class.temporary] спецификации C++). Таким образом, recivedRosImage
является указателем на член image
из const CvImage
, который уничтожается в конце выражения присваивания, и ваша программа вызывает неопределенное поведение путем разыменования recivedRosImage
в следующей строке.
В отличие от этого, эта строка кода:
cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image);
.. работает, потому что срок службы временного CvImageConstPtr
объекта проходит через cv::imshow()
вызова.
Один из способов фиксации проблемы заключается в проведении на временный CvImageConstPtr
объекта следующим образом:
CvImageConstPtr sharedCvImage = cv_bridge::toCvShare(msg, "bgr8");
cv::imshow("view", sharedCvImage->image);
Смотрите также § 1.5, примеры совместного использования данных изображения, из выше связанных вики статьи.