繁体   English   中英

动态分配对象数组

[英]Dynamically allocating array of objects

我需要一个DizzyCreature类型的双指针(我的类)指向一个DizzyCreature指针数组。 当我运行它时,我得到“访问冲突读取位置0x ...”。 我可以制作一个DizzyCreature *并很好地调用其成员函数,但是当无法运行该数组并对每个obj执行相同的操作时。

我按照这些说明操作: http//www.cplusplus.com/forum/beginner/10377/

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
  }
}

编辑:成员函数takeTurn()在DizzyCreature的父类中。 该程序使其成为函数,但只要它尝试更改私有成员变量,就会抛出异常。 如果重要的话,DizzyCreature属于GameCreature和WhirlyB,因为这是MI的一项任务。

您已为dcArrPtr分配了空间,但未分配此数组中的每个对象。 你必须做以下事情:

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;
}

这个:

dcPtr = new DizzyCreature[count];       

“创建”一个DizzyCreature数组,而:

dcArrPtr = new DizzyCreature*[count];

“创建”一个指向 DizzyCreature指针数组,但关键是不要为那些指向指针的指针创建实例。

无论如何,首选的解决方案是使用标准容器来完成这样的任务。 如果你真的想这样做(并且意识到这不是手动执行此操作的最佳做​​法)那么你需要一个循环来为指针数组中的eachelement调用new。

用一个

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

此外,如果您想使用原始指针(我不建议这样做),您必须为数组中的每个指针分配内存。

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_;
    }
};

您分配计数指针数组而不是计数对象数组。

代替

dcArrPtr = new DizzyCreature*[count];

你可能想要

dcArrPtr = new DizzyCreature[count];

你正在分配一个指针数组,但是这些指针在你将它们设置为某个东西之前是无效的。

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

就是说,从C ++开始时,您应该避免使用原始数组,而应使用std::arraystd::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();
  }
}

如果您已经看到执行二维数组动态内存分配的情况。 那将使您对在这种情况下如何进行处理有更好的了解。 大多数答案已经回答了你该怎么做。 但是只要通过任何链接,看看在二维数组的情况下如何分配内存。 那也会帮助你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM