0

ptr_vector のコピーに問題があります。

Act オブジェクトのベクトルを持つソリューション クラスを使用しています。各 Act クラス内には、他の Act オブジェクトにリンクする ptr_vector があります。txt ファイルからいくつかのデータを読み取り、それを Sol オブジェクトに保存します。この Sol オブジェクトを他の Sol オブジェクトにコピーするにはどうすればよいですか (たとえば、ベクター内)。release と clone を使用して独自のコピー コンストラクターを sol クラスに記述しようとしましたが、ptr_vector を簡単にコピーできないようです。

前もって感謝します。

class Sol
{
 public:
//data
int obj;
vector<Act*> deficit_act;
int deadline;
int nbr_res;
int nbr_act;
std::vector<Act> act;
std::vector<Res> res;
}

#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/ptr_container/clone_allocator.hpp>
class Act
{
public:
//static
int id;
int es;//earliest start
int ls;//latest start
int range;//difference between ls and es
int dur;//duration of the activity
std::vector<int> dem;//demand requirement for every resource: needs to be      initiliased
//predecessors and successors
int nrpr;
int nrsu;
boost::ptr_vector<Act> pr;
boost::ptr_vector<Act> su;
//dynamic
int start;
int end;
Act():id(-1),es(0),ls(0),range(0),dur(0),nrpr(0),nrsu(0),start(-1),end(-1){}
~Act(){}
    };

   //inside the main.cpp
    Sol emptysol;
read_instance(emptysol,instance_nr,"J301_1");
emptysol.calc_parameters();
vector<Sol> sol;
sol.reserve(pop_size);
for(int ind=0;ind<pop_size;++ind)
{
    sol.push_back(Sol(emptysol));// this throws a stack overflow error
}
4

1 に答える 1

0

スタック オーバーフロー エラーが発生するという事実は、コピー コンストラクターまたは push_back が無限再帰を開始することを示唆しています。あなたのケースでこれが起こる可能性があるのは、オブジェクトのポインターベクトルprsuポインターベクトルにActサイクルが含まれている場合です。つまり、ベクトル内のオブジェクトにサイクルが含まれているSol空でないActベクトルを持つオブジェクトをコピー構築しようとすると、このエラーが発生します。Act

これを明確にするために: ptr_vectors のコピー コンストラクターは、ポイントされたオブジェクトのコピー (ptr_vector 言語では「クローン」) を作成します。suメンバーがそれを所有する Act オブジェクトを (直接的または間接的に) 指す場合、無限再帰が開始されます。

このSO の質問は、ptr_vector コピー コンストラクターの詳細に入ります。

于 2013-09-20T08:47:51.807 に答える