включить общий доступ из этого сбоя - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь создать сетку с каждой точкой, указывающей на другую из сетки (переменная-член сток_ ), возможно, сама.Я хотел использовать shared_ptr для этого, и поэтому мне нужно было бы использовать weak_ptr для сток , так как он может указывать на себя.

Проблема в том, что этот код падает в файле shared_ptr_base.h:

// Now that __weak_count is defined we can define this constructor:
  template<_Lock_policy _Lp>
    inline
    __shared_count<_Lp>::__shared_count(const __weak_count<_Lp>& __r)
    : _M_pi(__r._M_pi) <------ HERE <-------
    {
      if (_M_pi != nullptr)
    _M_pi->_M_add_ref_lock();
      else
    __throw_bad_weak_ptr();
    }

со стеком:

std :: __ shared_count <(__ gnu_cxx :: _ Lock_policy) 2> :: __ shared_count at shared_ptr_base.h: 824 0x418898
std:: __ shared_ptr :: ____
Node ::еприсвоение () в точке.cpp: 43 0x417f3e
Сетка :: инициализация () в openlem.cpp: 799 0x407677
Сетка :: Сетка () в openlem.hpp: 152 0x4175dd
main () at orogen.cpp: 24 0x417361

Ты хоть представляешь, что я делаю неправильно?Вот мой код:

int main(){
    int  m = 12, n = 13;
    Grid grid = Grid ( m, n );
}

grid.hpp:

class Grid
{
private:
    std::vector<std::vector<NodePtr> > lattice_;    // lattice of nodes
}

grid.cpp:

void Grid::initialize ( int m, int n ){
    this->m_ = m;
    this->n = n;
    lattice_.reserve( m );
    for ( int i = 0; i < m; ++i ){
        lattice_.push_back( std::vector<NodePtr>() );
        lattice_[i].reserve( n );
        for ( int j = 0; j < n; ++j ){
//          NodePtr test = std::make_shared<Node>( );
            NodePtr test = std::shared_ptr<Node>( new Node );
            lattice_[i].push_back( std::move( test ) );
            test->drainInitialization();

            printf( "%i %i \n", lattice_.size(), lattice_[0].size() );
            printf( "%i %i \n", i, j );
        }
    }
}

node.hpp:

class Node : public std::enable_shared_from_this<Node>
{
    typedef std::shared_ptr<Node> NodePtr;
public:
    Node (); // Constructor
    void drainInitialization();
    ~Node (); // Destructor

    int          i; // Coordinate
    int          j; // Coordinate
    std::weak_ptr<Node> drain_;   // flow target
}

node.cpp:

Node::Node(): i(init_int), j(init_int), elevation_(init_double),
chann_el_slope_(init_double), chann_wa_slope_(init_double),
water_level_(init_double), uplift_(init_float), discharge_(init_uint),
border_(0), marker_(0){}

void Node::drainInitialization(){
    drain_ = shared_from_this();
}

1 Ответ

2 голосов
/ 16 марта 2019

После lattice_[i].push_back( std::move( test ) ), test больше не действителен и является нулевым указателем.Нет необходимости перемещать shared_ptr, просто скопируйте его в вектор.

В качестве альтернативы вы все равно можете перейти в вектор, но затем использовать lattice_[i].back()->drainInitialization() вместо test->drainInitialization().

...