0

次の std::list メンバーを持つ ObjRecRANSAC クラスがあります。

    std::list<OrientedPointPair> sampled_oriented_point_pairs_;

OrientedPointPair は、次のように ObjRecRANSAC 内で定義されたクラスです。

    class OrientedPointPair
    {
        public:
          OrientedPointPair (const float *p1, const float *n1, const float *p2, const float *n2)
          : p1_ (p1), n1_ (n1), p2_ (p2), n2_ (n2)
          {
          }

          virtual ~OrientedPointPair (){}

        public:
          const float *p1_, *n1_, *p2_, *n2_;
    };

ObjRecRANSAC クラスが構築されたら。への呼び出しsample_oriented_point_pairs_.clear()が行われ、セグ フォールトが発生します。

gdb を使用してエラーをデバッグしようとしましたが、次のようになりました。

print sampled_oriented_point_pairs_
$4 = {<std::_List_base<pcl::recognition::ObjRecRANSAC::OrientedPointPair, std::allocator<pcl::recognition::ObjRecRANSAC::OrientedPointPair> >> = {
    _M_impl = {<std::allocator<std::_List_node<pcl::recognition::ObjRecRANSAC::OrientedPointPair> >> = {<__gnu_cxx::new_allocator<std::_List_node<pcl::recognition::ObjRecRANSAC::OrientedPointPair> >> = {<No data fields>}, <No data fields>}, _M_node = {
        _M_next = 0x3f7d70a4, _M_prev = 0x0}}}, <No data fields>}
(gdb) s
std::list<pcl::recognition::ObjRecRANSAC::OrientedPointPair, std::allocator<pcl::recognition::ObjRecRANSAC::OrientedPointPair> >::clear (this=0x7fffffffdb38) at /usr/include/c++/4.6/bits/stl_list.h:1197
1197            _Base::_M_clear();
(gdb) s
std::_List_base<pcl::recognition::ObjRecRANSAC::OrientedPointPair, std::allocator<pcl::recognition::ObjRecRANSAC::OrientedPointPair> >::_M_clear (this=0x7fffffffdb38) at /usr/include/c++/4.6/bits/list.tcc:70
70        _Node* __cur = static_cast<_Node*>(this->_M_impl._M_node._M_next);
(gdb) print __cur
$5 = (
    std::_List_base<pcl::recognition::ObjRecRANSAC::OrientedPointPair, std::allocator<pcl::recognition::ObjRecRANSAC::OrientedPointPair> >::_Node *) 0x7a6c60
(gdb) print *__cur
$6 = {<std::__detail::_List_node_base> = {_M_next = 0x50a330, _M_prev = 0x7fff00000000}, _M_data = {_vptr.OrientedPointPair = 0x0, 
    p1_ = 0x7fffef9364d8, n1_ = 0x1b280e0, p2_ = 0x1ed2f00, n2_ = 0x1ed2f00}}
(gdb) s
71        while (__cur != &this->_M_impl._M_node)
(gdb) s
73        _Node* __tmp = __cur;
(gdb) s
74        __cur = static_cast<_Node*>(__cur->_M_next);
(gdb) print __cur
$7 = (
    std::_List_base<pcl::recognition::ObjRecRANSAC::OrientedPointPair, std::allocator<pcl::recognition::ObjRecRANSAC::OrientedPointPair> >::_Node *) 0x3f7d70a4
(gdb) print *__cur
** Cannot access memory at address 0x3f7d70a4 **
(gdb) print &this->_M_impl._M_node
$8 = (std::__detail::_List_node_base *) 0x7fffffffdb38
(gdb) s

Program received signal SIGSEGV, Segmentation fault.
0x00000000004c1608 in std::_List_base<pcl::recognition::ObjRecRANSAC::OrientedPointPair, std::allocator<pcl::recognition::ObjRecRANSAC::OrientedPointPair> >::_M_clear (this=0x7fffffffdb38) at /usr/include/c++/4.6/bits/list.tcc:74
74        __cur = static_cast<_Node*>(__cur->_M_next);

明らかにこれが問題です:アドレス 0x3f7d70a4 のメモリにアクセスできません

私が理解していないのは、この時点で current が宣言されていないのに、行 70 の実行前にアドレスが__cur最初に設定される 理由です。0x7a6c60また、70行目の実行前に印刷*__curすると、これも驚くべき値が返されるようです。

sampled_directional_point_pair_ はクラスで宣言されているだけで、コンストラクターで初期化されていません。これが問題でしょうか?ただし、このコードは以前は機能していましたか?

4

0 に答える 0