NullReferenceException при push_back

Я получаю исключение nullReferenceException при использовании vector.push_back для нового объекта.

В сегменте кода вы видите, что у меня есть векторный объект в качестве указателя, но у меня изначально он был как не указатель, я изменил его в своем поиске неисправностей из отчаяния.

Я полностью прошел процедуру создания экземпляра BasicSolver, чтобы убедиться, что в нем нет проблем, а также отделил создание экземпляра от push_back, чтобы помочь показать, что именно в push_back возникает проблема.

InformedSolver1 & 2 являются потомками BasicSolver. вектор включен в BasicSolver и, следовательно, в PuzzleSolver также.

#include "stdafx.h"
#include "puzzleSolver.h"


PuzzleSolver::PuzzleSolver()
{
   solvers = new vector<BasicSolver*>();
}

void PuzzleSolver::createPuzzle(string input)
{                                             //hitting step-over
   BasicSolver* temp = new BasicSolver(input);// no errors
   solvers->push_back(temp);                  // nullReferenceException
   solvers->push_back(new InformedSolver1(input));
   solvers->push_back(new InformedSolver2(input));
}

Это должна быть вся соответствующая информация. Дайте мне знать, если у вас есть какие-либо идеи относительно того, что вызывает это / как это исправить! Благодарю.

Редактировать: добавлены базовый конструктор BasicSolver и методы зависимостей по запросу комментария, также немного фона: это решатель судоку для класса AI

BasicSolver::BasicSolver(string input)
{
   peers = new vector<Peer*>();
   squares = new vector<Square*>();
   unsolved = new vector<Square*>();
   solved = new vector<Square*>();
   createStructure(input);
   original = input;
   mistakes = 0;
}

void BasicSolver::createStructure(string input)
{
   try
   {
       createEmptyStructure(peers, squares, unsolved);
      //Parse the puzzle and assign input to squares
      int numCharsToRead = MAX_SQUARES;   //makes sure vector isn't outside its range
      if (input.length() < MAX_SQUARES)   //makes sure string isn't outside its range
         numCharsToRead = input.length(); 
      for (int i = 0; i < numCharsToRead; i++)
      {
         if(input[i] != '.')
            insertValue(input[i], (*squares)[i], unsolved);
      }
   }
   catch(exception e)
   {
      throw e;
   }
}

void BasicSolver::createEmptyStructure(vector<Peer*> *workingPeers, vector<Square*> *workingSquares, vector<Square*> *workingUnsolved)
{
    for (int i = 0; i < MAX_PEERS; i++)
    {
        workingPeers->push_back(new Peer());
    }
   for (int i = 0; i < 81; i++)
   {
      try
      {
          workingSquares->push_back(new Square('.'));

         //Adding the square to its corresponding peers
         (*workingPeers)[i / MAX_ROWS]->addSquare((*workingSquares)[i]); //adds the square into its appropriate row of peers
         (*workingPeers)[(i % MAX_ROWS) + COL_OFFSET]->addSquare((*workingSquares)[i]); //adds the square into its appropriate column of peers
         int tempBoxCol = (i % MAX_ROWS) / MAX_BOX_COLS; //returns the box column (0,1,2)

         if ((i / MAX_ROWS) < BOX_ROW_WIDTH) //if its box is in the first row
         {
             (*workingPeers)[tempBoxCol + BOX_OFFSET]->addSquare((*workingSquares)[i]);
         }
         else if ((i / MAX_ROWS) < (2 * BOX_ROW_WIDTH)) //if its box is in the second row
         {
             (*workingPeers)[BOX_ROW_WIDTH + tempBoxCol + BOX_OFFSET]->addSquare((*workingSquares)[i]);
         }
         else //if the box is in the third row
         {
             (*workingPeers)[2 * BOX_ROW_WIDTH + tempBoxCol + BOX_OFFSET]->addSquare((*workingSquares)[i]);
         }
      }
      catch(exception e)
      {
         throw e;
      }
   }
   *workingUnsolved = *workingSquares;
}

Edit2: личные тесты добавить эти строки:

vector<BasicSolver*>* test = new vector<BasicSolver*>();
test->push_back(temp);

до

solvers->push_back(temp);

и они выполняются нормально, я также заметил, что во время выполнения решатели перечислены как вне области видимости, хотя это защищенная переменная BasicSolver.

1 ответ

Решение

Проблема заключалась в том, что в вызывающем источнике не был должным образом создан экземпляр PuzzleSolver. Спасибо @TheDark за предложение проверить это!

Другие вопросы по тегам