Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 由于指针可能松动而导致的分段错误_C++ - Fatal编程技术网

C++ 由于指针可能松动而导致的分段错误

C++ 由于指针可能松动而导致的分段错误,c++,C++,我有一些关于段故障的问题 Program received signal SIGSEGV, Segmentation fault. 0x0000000000403a62 in std::_Deque_iterator<float, float&, float*>::_Deque_iterator (this=0x7fffffffc5c0, __x=...) at /usr/include/c++/4.6/bits/stl_deque.h:136 136

我有一些关于段故障的问题

Program received signal SIGSEGV, Segmentation fault.
0x0000000000403a62 in std::_Deque_iterator<float, float&, float*>::_Deque_iterator (this=0x7fffffffc5c0, __x=...)
    at /usr/include/c++/4.6/bits/stl_deque.h:136
136         _M_last(__x._M_last), _M_node(__x._M_node) { }
(gdb) up
#1  0x0000000000403a0f in std::deque<float, std::allocator<float> >::begin (this=0x64) at /usr/include/c++/4.6/bits/stl_deque.h:1010
1010          { return this->_M_impl._M_start; }
(gdb) up
#2  0x000000000040326f in std::deque<float, std::allocator<float> >::front (this=0x64) at /usr/include/c++/4.6/bits/stl_deque.h:1286
1286          { return *begin(); }
(gdb) up
#3  0x000000000040248c in std::queue<float, std::deque<float, std::allocator<float> > >::front (this=0x64)
程序接收信号SIGSEGV,分段故障。
std::_Deque_iterator::_Deque_iterator中的0x0000000000403a62(this=0x7fffffffc5c0,que x=…)
at/usr/include/c++/4.6/bits/stl_deque.h:136
136_M_last(__x._M_last),_M_node(__x._M_node){}
(gdb)向上
#在/usr/include/c++/4.6/bits/stl_deque.h:1010处,std::deque::begin(this=0x64)中的1 0x000000000043a0f
1010{返回此->\M\u impl.\M\u start;}
(gdb)向上
#在/usr/include/c++/4.6/bits/stl_deque.h:1286的std::deque::front(this=0x64)中的2 0x000000000040326f
1286{return*begin();}
(gdb)向上
#std::queue::front中的3 0x000000000040248c(此=0x64)
at/usr/include/c++/4.6/bits/stl_queue.h:165 165返回c.前(); (gdb)向上 #在KDTree::Node::Create(this=0x6251c0,coords=0x623ec0,limit=500)中的4 0x0000000000402ee3。hxx:64 64如果((*itC)->front()>MaxOver)MaxOver=(*itC)->front()

这是一段代码

template< class T, class D >
void KDTree< T, D >::Node::
Create( Coords* coords, D limit )
{
    Coords* newCoordsBelowMedian = new Coords(); 
    Coords* newCoordsAboveMedian = new Coords();
    D maxAbove = 0,
    minAbove = 0,
    maxBelow = 0,
    minBelow = 0;
    this -> m_Coords = coords;
    this -> m_Median = GetMedian( *coords );
    typename Coords :: iterator itC = this -> m_Coords -> begin( ); 
    //Change of coordinates for next iteration
    for( ; itC != this -> m_Coords -> end( ); itC++ )
    {
        Dims* newDim = *itC;
        D value = newDim -> front( );
        newDim -> pop( );
        newDim -> push( value );
        if( newDim -> front() >= this -> m_Median )   newCoordsAboveMedian -> insert(  );
        else                                          newCoordsBelowMedian -> insert(  );
    }  

    typename Coords :: iterator itCA = newCoordsAboveMedian -> begin( );
    typename Coords :: iterator itCB = newCoordsBelowMedian -> begin( );

    minBelow = std::numeric_limits<D>::max();
    minAbove = std::numeric_limits<D>::max();
                    //Max radius
    for( ; itC != newCoordsAboveMedian -> end( ); itCA++ )                             
    {
      if( ( *itC ) -> front() > maxAbove ) maxAbove = ( *itC ) -> front();
      if( ( *itC ) -> front() < minAbove ) minAbove = ( *itC ) -> front();
    }
    for( ; itC != newCoordsBelowMedian -> end( ); itCB++ )
    {
        if( ( *itC ) -> front() > maxBelow ) maxBelow = ( *itC ) -> front();
        if( ( *itC ) -> front() > maxBelow ) minBelow = ( *itC ) -> front();
    }

    if( abs( maxAbove - minAbove ) < limit && newCoordsAboveMedian -> size() > 0 )
    {
        this -> m_R = new Node();
        this -> m_R -> Create( newCoordsAboveMedian, limit );
    }
    if( abs( maxBelow - minBelow ) < limit && newCoordsAboveMedian -> size() > 0 )
    {
        this -> m_L = new Node();
        this -> m_L -> Create( newCoordsBelowMedian, limit );
    }       
}    
模板
void KDTree::节点:
创建(坐标*坐标,D限制)
{
Coords*newCoordsBelowMedian=新Coords();
Coords*newcoordsabovemedia=新Coords();
D maxover=0,
minAbove=0,
MaxLower=0,
最小低于=0;
这->m_Coords=Coords;
这->m_Median=GetMedian(*coords);
typename Coords::iterator itC=this->m_Coords->begin();
//为下一次迭代更改坐标
对于(;itC!=this->m_Coords->end();itC++)
{
Dims*newDim=*itC;
D值=newDim->front();
newDim->pop();
newDim->push(值);
如果(newDim->front()>=this->m_Median)newCoordsAboveMedian->insert();
else newCoordsBelowMedian->insert();
}  
typename Coords::iterator itCA=newcoordsabovemedia->begin();
typename Coords::iterator itCB=newCoordsBelowMedian->begin();
minBelow=std::numeric_limits::max();
minAbove=std::numeric_limits::max();
//最大半径
对于(;itC!=newCoordsBoveMedian->end();itCA++)
{
如果((*itC)->front()>maxOver)maxOver=(*itC)->front();
如果((*itC)->front()front();
}
对于(;itC!=newCoordsBelowMedian->end();itCB++)
{
如果((*itC)->front()>maxdown)maxdown=(*itC)->front();
如果((*itC)->front()>maxdown)mindown=(*itC)->front();
}
如果(abs(maxover-minAbove)size()>0)
{
此->m_R=新节点();
此->m\u R->创建(新合作伙伴、限制);
}
如果(abs(最大低于-最小低于)size()>0)
{
此->m_L=新节点();
此->m_L->创建(newCoordsBelowMedian,限制);
}       
}    

我怀疑是因为最初的指针在完成时丢失了,然而,我不知道这个问题的任何解决方案,有什么想法吗

似乎
itC
this->m_Coords
的迭代器,它在第一个循环中一直运行到最后。相同的迭代器用于控制后面的循环。你是说这个环吗

 for( ; itC != newCoordsAboveMedian -> end( ); itCA++ )                             
            {
              if( ( *itC ) -> front() > maxAbove ) maxAbove = ( *itC ) -> front();
              if( ( *itC ) -> front() < minAbove ) minAbove = ( *itC ) -> front();
            }
for(;itC!=newCoordsBoveMidian->end();itCA++)
{
如果((*itC)->front()>maxOver)maxOver=(*itC)->front();
如果((*itC)->front()front();
}
阅读

 for( ; itCA != newCoordsAboveMedian -> end( ); itCA++ )                             
            {
              if( ( *itCA ) -> front() > maxAbove ) maxAbove = ( *itCA ) -> front();
              if( ( *itCA ) -> front() < minAbove ) minAbove = ( *itCA ) -> front();
            }
for(;itCA!=newCoordsAboveMedian->end();itCA++)
{
如果((*itCA)->front()>maxOver)maxOver=(*itCA)->front();
如果(*itCA)->front()front();
}
。。。或者,如果我写这个循环,我会怎么做:

  for (typename Coords::iterator it = newCoordsAboveMedian->begin( ),
                                 end = newCoordsAboveMedian->end();
       it != end; ++it) {
              if( ( *it ) -> front() > maxAbove ) maxAbove = ( *it ) -> front();
              if( ( *it ) -> front() < minAbove ) minAbove = ( *it ) -> front();
            }
for(typename Coords::iterator it=newcoordsabovemedia->begin(),
end=newCoordsAboveMedian->end();
它!=结束;++它){
如果((*it)->front()>maxover)maxover=(*it)->front();
如果((*it)->front()front();
}

(对于另一个循环也是如此)。

似乎
itC
this->m_Coords
的迭代器,它在第一个循环中一直运行到最后。相同的迭代器用于控制后面的循环。你是说这个环吗

 for( ; itC != newCoordsAboveMedian -> end( ); itCA++ )                             
            {
              if( ( *itC ) -> front() > maxAbove ) maxAbove = ( *itC ) -> front();
              if( ( *itC ) -> front() < minAbove ) minAbove = ( *itC ) -> front();
            }
for(;itC!=newCoordsBoveMidian->end();itCA++)
{
如果((*itC)->front()>maxOver)maxOver=(*itC)->front();
如果((*itC)->front()front();
}
阅读

 for( ; itCA != newCoordsAboveMedian -> end( ); itCA++ )                             
            {
              if( ( *itCA ) -> front() > maxAbove ) maxAbove = ( *itCA ) -> front();
              if( ( *itCA ) -> front() < minAbove ) minAbove = ( *itCA ) -> front();
            }
for(;itCA!=newCoordsAboveMedian->end();itCA++)
{
如果((*itCA)->front()>maxOver)maxOver=(*itCA)->front();
如果(*itCA)->front()front();
}
。。。或者,如果我写这个循环,我会怎么做:

  for (typename Coords::iterator it = newCoordsAboveMedian->begin( ),
                                 end = newCoordsAboveMedian->end();
       it != end; ++it) {
              if( ( *it ) -> front() > maxAbove ) maxAbove = ( *it ) -> front();
              if( ( *it ) -> front() < minAbove ) minAbove = ( *it ) -> front();
            }
for(typename Coords::iterator it=newcoordsabovemedia->begin(),
end=newCoordsAboveMedian->end();
它!=结束;++它){
如果((*it)->front()>maxover)maxover=(*it)->front();
如果((*it)->front()front();
}

(对于另一个循环也是如此)。

我已经删除了你的C标记。我已经删除了你的C标记;)实际上,无论你做了什么,都没有删除C标记,因为我只是删除了:)谢谢,我不确定是否包含它。我已经删除了3级缩进。;)我已经删除了你的C标签。我已经删除了你的C标签;)交流电