pure virtual method called error
Solution 1
There's another type of bug, which can cause this error message to be printed.
You deleted the object, and later you're trying to make a call on it. It's undefined behaviour, and on some compilers, if you're lucky, that's what you'll see. Try to run your code with valgrind.
http://tombarta.wordpress.com/2008/07/10/gcc-pure-virtual-method-called/
Solution 2
You're calling a pure virtual function from a constructor in some code that you haven't included for us to see.
![Cemre Mengü](https://i.stack.imgur.com/XOJW1.jpg?s=256&g=1)
Comments
-
Cemre Mengü about 2 years
I have the following definitions:
class PartitioningMethod { public: virtual void addConstraints(ConstraintManager& cm) = 0; virtual bool hasMoreConstraints() = 0; virtual void setQuery(const Query& q) = 0; virtual ~PartitioningMethod(){ } }; class Random : public PartitioningMethod { private: vector< ref<Expr> > constraints; vector< ref<Expr> >::iterator it; vector< ref<Expr> >::iterator end; int numConstraints; RNG theRNG; public: void setQuery(const Query& q) { constraints.clear(); //Set random number //srand ( unsigned ( time (NULL) ) * theRNG.getInt32() ); srand ( theRNG.getInt32() ); //Copy constraints copy(q.constraints.begin(),q.constraints.end(),std::back_inserter(constraints)); //Shuffle Randomly std::random_shuffle(constraints.begin(),constraints.end(), p_myrandom); it = constraints.begin(); end = constraints.end(); numConstraints = constraints.size(); } void addConstraints(ConstraintManager& cm) { int step = rand() % numConstraints + 1; while(step != 0) { cm.addConstraint(*it); ++it; --step; --numConstraints; } } bool hasMoreConstraints() { return it != end; } }; bool PartitioningSolver::computeInitialValues(const Query& query, const std::vector<const Array*> &objects, std::vector< std::vector<unsigned char> > &values, bool &hasSolution) { fprintf(stderr,"INIT\n"); // If there are no constraints in the query if(query.constraints.size() == 0 || query.constraints.size() == 1) return solver->impl->computeInitialValues(query, objects, values, hasSolution); // If the number constraints in the query are > 0 method->setQuery(query); ConstraintManager cm; ref<Expr> expr = query.expr; fprintf(stderr,"Begin partitioning\n"); fprintf(stderr,"---------------------\n"); while(method->hasMoreConstraints()){ fprintf(stderr, "HERE"); //Add Constraints method->addConstraints(cm); //Construct a query Query temp_query(cm,expr); ExprPPrinter::printQuery(std::cerr,temp_query.constraints,temp_query.expr); fprintf(stderr,"---------------------\n"); //Query STP to check if satisfiable values.clear(); if(!solver->impl->computeInitialValues(temp_query, objects, values, hasSolution)) return false; //If not, return immediately (a win!) if(!hasSolution) return true; //If a solution is returned, check if the solution satisfies the entire set of constraints vector<const Array*> obj = objects; Assignment solution(obj, values); bool satisfiesAll = checkSolution(solution, query.constraints); // fprintf(stderr,"Satisfies all: %i\n", satisfiesAll); // If it is successful, return the solution (a win again!), if(satisfiesAll) return true; // If not add more constraints (if there is more) and repeat } return true; }
A Partial definition for the Partitioning solver class:
class PartitioningSolver : public SolverImpl { private: Solver* solver; PartitioningMethod* method; bool checkSolution(Assignment& solution, const ConstraintManager& constraints); public: PartitioningSolver(Solver *s, PartitioningMethod* pm) : solver(s), method(pm) { } ~PartitioningSolver() { delete solver; delete method; } };
Sorry for pasting such a long snippet of code but I have been working on it for hours and keep getting the eror
pure virtual method called terminate called without an active exception
I am not sure what's wrong. It seems to fail in computeInitialValues function where
fprintf(stderr,"Begin partitioning\n");
is located. I tried adding print statements as a last resort but even they don't print anything.. Any ideas is appreciated.EDIT:
Ok so I changed the name Random to Ran and it started to work. I was creating this class instance on the fly as an argument with new Random() I guess it was mixing up with another constructor or something else I dont know.. -
Cemre Mengü almost 12 yearsI tried using valgrind but for some reason it doesn't print an error message for this error.. I just get the crash output and that's it