Hi, fixed in the trunk, patch is attached. Christian
-- Christian Schulte, www.ict.kth.se/~cschulte/ From: users-boun...@gecode.org [mailto:users-boun...@gecode.org] On Behalf Of Farshid Hassani Bijarbooneh Sent: Thursday, July 11, 2013 6:01 PM To: users@gecode.org Subject: [gecode-users] operator = for NaryUnion Hi, In Gecode 4.1 creating n-ary union of variable ranges and assigning to a NaryUnion causes a segmentation fault, whereas in Gecode 3.7.3 it seems to work: Region myRegion(*this); Iter::Ranges::NaryUnion narr[2]; IntVarRanges* varRange = myRegion.alloc<IntVarRanges>(x.size()); // x is IntVarArray variables of the model for (int r=0; r < x.size(); r++) { varRange[r].init(x[r]); } narr[0] = Iter::Ranges::NaryUnion(myRegion, varRange, x.size()); If we instead create only one NaryUnion then it works fine in Gecode 4.1: Iter::Ranges::NaryUnion uni(myRegion, varRange, x.size()); I also attached a minimal code demonstrating this issue. Do you think if there is something I'm missing here? Cheers, Farshid _______________________________________________ Gecode users mailing list users@gecode.org https://www.gecode.org/mailman/listinfo/gecode-users
Index: gecode/iter/ranges-list.hpp =================================================================== --- gecode/iter/ranges-list.hpp (revision 13860) +++ gecode/iter/ranges-list.hpp (working copy) @@ -130,12 +130,11 @@ forceinline RangeListIter::RangeListIter(void) - : rlio(NULL) {} + : rlio(NULL), h(NULL), c(NULL) {} forceinline RangeListIter::RangeListIter(Region& r) - : rlio(new (r.ralloc(sizeof(RLIO))) RLIO(r)), - h(NULL), c(NULL) {} + : rlio(new (r.ralloc(sizeof(RLIO))) RLIO(r)), h(NULL), c(NULL) {} forceinline void RangeListIter::init(Region& r) { @@ -146,19 +145,21 @@ forceinline RangeListIter::RangeListIter(const RangeListIter& i) : rlio(i.rlio), h(i.h), c(i.c) { - rlio->use_cnt++; + if (rlio != NULL) + rlio->use_cnt++; } forceinline RangeListIter& RangeListIter::operator =(const RangeListIter& i) { if (&i != this) { - if (--rlio->use_cnt == 0) { + if ((rlio != NULL) && (--rlio->use_cnt == 0)) { Region& r = rlio->allocator(); rlio->~RLIO(); r.rfree(rlio,sizeof(RLIO)); } rlio = i.rlio; - rlio->use_cnt++; + if (rlio != NULL) + rlio->use_cnt++; c=i.c; h=i.h; } return *this; @@ -166,7 +167,7 @@ forceinline RangeListIter::~RangeListIter(void) { - if (--rlio->use_cnt == 0) { + if ((rlio != NULL) && (--rlio->use_cnt == 0)) { Region& r = rlio->allocator(); rlio->~RLIO(); r.rfree(rlio,sizeof(RLIO)); Index: gecode/iter/ranges-union.hpp =================================================================== --- gecode/iter/ranges-union.hpp (revision 13860) +++ gecode/iter/ranges-union.hpp (working copy) @@ -276,7 +276,8 @@ forceinline - NaryUnion::NaryUnion(void) {} + NaryUnion::NaryUnion(void) + : f(NULL) {} template<class I> forceinline void
_______________________________________________ Gecode users mailing list users@gecode.org https://www.gecode.org/mailman/listinfo/gecode-users