[英]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::array
和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();
}
}
如果您已经看到执行二维数组动态内存分配的情况。 那将使您对在这种情况下如何进行处理有更好的了解。 大多数答案已经回答了你该怎么做。 但是只要通过任何链接,看看在二维数组的情况下如何分配内存。 那也会帮助你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.