您好,我在我的学校做过小项目,并不断为我感到奇怪。

在我的对象中调用方法之一时,此指针设置为 0xcdcdcdcd 。我用谷歌搜索并找到了一些有关在调用之前擦除内存或销毁对象的信息,但是我确保之前没有调用析构函数。

世界

class Organism;
class Human;

class World
{
private:
   vector <Organism*> organisms;

   vector <Organism*> organismsToAdd;

   vector <string> logs;

   int turn_;

   void initializeWorld();

   void drawInterface();

   void drawInfo();
   void drawOrganisms();
   void nextTurn();
   bool isPositionTaken(int x, int y);
   Organism* getOrganism(int x, int y);
   void queueOrganismToAdd(Organism* newOrganism);
   void addQueuedOrganisms();
   void generateStartOrganisms();
   bool isPlayerAlive();
public:
   void executeMove(Organism* moving, int toX, int toY);  //here's the problem
   bool isPositionValid(int x, int y);
   World(int x, int y);
   struct
   {
       int x_, y_;
   } worldSize;
   void startGame();
   ~World();
 };

executeMove
void World::executeMove(Organism* moving, int toX, int toY)
{
   cout << moving->getSign();
   getch();
   if (!isPositionTaken(toX, toY))  //  <- here it brake
   {
       moving->setPosition(toX, toY);
   }
   else if (moving->getSign() == getOrganism(toX, toY)->getSign())
   {
    //multiply
    //make log
   }
   else {
      if (!moving->specialCollision((getOrganism(toX, toY)))) return;
      if (!getOrganism(toX, toY)->specialCollision(moving)) return;
      if (moving->getPower() >= getOrganism(toX, toY)->getPower())
      {
        //log
        //delete losser
       }
      else
      {
        //log
        //delete losser
       }
    moving->setPosition(toX, toY);
   }
}

isPositioinTaken
bool World::isPositionTaken(int x, int y)
{
    for (int i = 0; i < this->organisms.size(); ++i)  // here this is set to 0xcdcdcdcd
    {
        if (organisms[i]->getPositionX() == x && organisms[i]->getPositionY() == y) return true;

    }
    return false;
}

方法isPositionTaken在项目的其他部分工作得很糟糕,因此如果发现错误,我会完全迷失,我非常感谢

最佳答案

由于organisms成员具有默认的构造函数,因此在所指示的行上看到此行为的唯一方法是对executeMove()的调用是否使用未初始化的指针。

就像是:

World *ptr; // not initialized on stack
    ...
ptr->executeMove();

或从具有相同问题的另一个方法调用此方法。

关于c++ - 使用此-> 0xcdcdcdcd,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36672154/

10-11 08:13