Я пытаюсь создать сетку с каждой точкой, указывающей на другую из сетки (переменная-член сток_ ), возможно, сама.Я хотел использовать 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();
}