我需要一个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的一项任务。
答案 0 :(得分:2)
您已为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;
}
答案 1 :(得分:1)
此:
dcPtr = new DizzyCreature[count];
“创建”DizzyCreature
s的数组,而:
dcArrPtr = new DizzyCreature*[count];
“创建”一个指针到DizzyCreature
的数组,但关键是不要为那些指向指针的指针创建实例。
首选的解决方案是使用标准容器来完成这样的任务。如果真的想要这样做(并且意识到手动执行此操作并非最佳做法),那么您将需要一个循环来为指针数组中的eachelement调用new。
答案 2 :(得分:0)
使用
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_;
}
};
答案 3 :(得分:0)
您分配计数指针数组而不是计数对象数组。
而不是
dcArrPtr = new DizzyCreature*[count];
你可能想要
dcArrPtr = new DizzyCreature[count];
答案 4 :(得分:0)
你正在分配一个指针数组,但是这些指针在你将它们设置为某些东西之前是无效的。
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();
}
}
答案 5 :(得分:0)
如果你已经看到了2维数组的动态内存分配的实现。这样可以让您更好地了解如何在这种情况下继续进行。大多数答案已经回答了你该怎么做。但只需浏览任何链接,看看在二维数组的情况下如何分配内存。那对你也有帮助。