pure virtual method called error

12,155

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.

When my base class's constructor calls a virtual function on its this object, why doesn't my derived class's override of that virtual function get invoked?

Share:
12,155
Cemre Mengü
Author by

Cemre Mengü

I try and catch

Updated on June 25, 2022

Comments

  • Cemre Mengü
    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ü
    Cemre Mengü almost 12 years
    I 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