次の 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_ はクラスで宣言されているだけで、コンストラクターで初期化されていません。これが問題でしょうか?ただし、このコードは以前は機能していましたか?