Dynamically allocating array of objects

ε祈祈猫儿з 提交于 2019-12-13 00:18:07

问题


I need a double pointer of type DizzyCreature (my class) to point to an array of DizzyCreature pointers. When I run it I get "Access violation reading location 0x...". I can make a DizzyCreature* and call its member functions just fine, but when cannot run through the array and do the same thing for each obj.

I am following these instructions: http://www.cplusplus.com/forum/beginner/10377/

Code

Server.h:

class Server
{
 public:
  Server(int x, int y, int count);
  ~Server(void);

  void tick();


 private:
  DizzyCreature** dcArrPtr;
  DizzyCreature* dcPtr;

  int _count;
};

Server.cpp:

Server::Server(int x, int y, int count)
{
  dcPtr = new DizzyCreature[count];       // this works just fine

  dcArrPtr = new DizzyCreature*[count];   // this doesn't (but gets past this line)
  _count = count;
}

Server::~Server(void)
{
  delete[] *dcArrPtr;
  delete[] dcPtr;
}

void Server::tick()
{
  dcPtr->takeTurn();                // just fine

  for (int i = 0; i < _count; i++) {
    dcArrPtr[i]->takeTurn();        // crash and burn
  }
}

EDIT: The member function takeTurn() is in a parent class of DizzyCreature. The program makes it into the function, but as soon as it attempts to change a private member variable the exception is thrown. If it matters, DizzyCreature is of type GameCreature and WhirlyB as this is an assignment on MI.


回答1:


You have allocated space for dcArrPtr, but didn't allocate every object in this array. You must do following:

Server::Server(int x, int y, int count)
{
  dcPtr = new DizzyCreature[count];

  dcArrPtr = new DizzyCreature*[count];
  for ( int i = 0; i < count; i++ ) {
    dcArrPtr[ i ] = new DizzyCreature;
  }
  _count = count;
}

Server::~Server(void)
{
  for ( int i = 0; i < count; i++ ) {
    delete dcArrPtr[ i ];
  }
  delete[] *dcArrPtr;
  delete[] dcPtr;
}



回答2:


This:

dcPtr = new DizzyCreature[count];       

"creates" an array of DizzyCreatures, whereas:

dcArrPtr = new DizzyCreature*[count];

"creates" an array of pointers to DizzyCreatures, but crucially doesn't create instances for those pointers to point to.

The preferred solution is to use a standard container for tasks like this anyway though. If you really want to do it like this (and are aware that it's not best practice to do this manually) then you'll need a loop to call new for eachelement in the array of pointers.




回答3:


You allocate an array of count pointers instead of an array of count objects.

Instead of

dcArrPtr = new DizzyCreature*[count];

you might want to

dcArrPtr = new DizzyCreature[count];



回答4:


You're allocating an array of pointers, but those pointers aren't valid until you set them to something.

double **arr = new double*[10];
for(int i=0;i<10;++i) {
    arr[i] = new double[10];
}

That said, when starting out with C++ you should probably avoid raw arrays and instead use std::array and std::vector:

class Server
{
 public:
  Server(int x, int y, int count);

  void tick();


 private:
  std::vector<std::vector<DizzyCreature>> dcArrPtr;
  std::vector<DizzyCreature> dcPtr;


};

Server::Server(int x, int y, int count)
{
  dcPtr.resize(count);

  dcArrPtr.resize(count);
}



void Server::tick()
{
  dcPtr[0].takeTurn();

  for (int i = 0; i < dcArrPtr.size(); i++) {
    dcArrPtr[i][0].takeTurn();
  }
}



回答5:


Use a

std::vector<std::vector<DizzyCreature>>

Furthermore, if you want to use raw pointers (which I do not recommend), you'll have to allocate memory for each pointer in your array.

class A
{
    std::vector<std::vector<int>> v_;
public:
    A()
        : v_(500, std::vector<int>(500))
    {} // 500 x 500
};

class B
{
    int** v_;
public:
    B()
        : v_(new int*[500])
    { // not even exception safe
        for (int i = 500; i--; )
            v_[i] = new int[500];
    }
    ~B()
    {
        for (int i = 500; i--; )
            delete[] v_[i];
        delete[] v_;
    }
};



回答6:


If you would have seen the implementation of dynamic memory allocation of 2-Dimensional array . That would have given you a better insight of how to proceed in such cases . Most of the answers has already answered you what to do . But just go through any link and see how is memory allocated in case of 2-D array . That Will also help you .



来源:https://stackoverflow.com/questions/9503718/dynamically-allocating-array-of-objects

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!