指向指针的指针在调用函数时获得EXC_BAD_ACCESS
我有两个类,一个叫Handler
,另一个叫Dice
。在我的Handler
类中,我有一个名为Dice **dices
的私有变量和一个名为rollDices
的公共函数。在我的Dice
类中,我有一个叫做折腾的函数,它会随机化一个数字1-6。问题是,当功能rollDices
正在调用功能折腾时,我得到EXT_BAD_ACCESS
在toss
函数。有谁知道为什么,并有解决方案吗?指向指针的指针在调用函数时获得EXC_BAD_ACCESS
我Handler.cpp:
void Handler::rollDices(){
Dice **allDices = new Dice*[this->nrOfDices];
this->dices = allDices;
dices[nrOfDices]= new Dice(nrOfDices);
int count =1;
for (int i = 0; i < this->nrOfDices; i++)
{
allDices[i]->toss();
cout << "Dice "<< count << ": " << allDices[i]->getValue() << endl;
count ++;
}
}
我Dice.cpp:
void Dice::toss(){
this->value = rand()%this->nrOfSides+1; //Value is a private int in Dice class
}
如果你需要更多的代码,我可以将它张贴,只是告诉我!
Dice **allDices = new Dice*[nrOfDices];
分配顶层指针,现在我们拥有内存中的所有行。当您添加列时
dices[nrOfDices]= new Dice(nrOfDices);
这不会为所有行添加新的Dice
。它在dices
有效范围的末尾添加一个新的Dice
。你需要做的是使用一个循环,并经过所有行并添加Dice
到每一个像
for (int i = 0; i < nrOfDices; i++)
dices[i] = new Dice(nrOfDices);
我明白你说什么,一切似乎合乎逻辑,但是,我得到了和以前一样的问题。我添加了dices [i] = new Dice(nrOfDices);到我的循环,但现在我得到错误:EXC_ARITHMETIC – pottsork
@pottsork什么是'allDices',它是如何初始化? – NathanOliver
是不是allDices只是一个指针指向数组,它指向类骰子,我分配内存的大小为nrOfDices?因为这是我使用allDices的代码中的第一次。 – pottsork
你只分配在指数nrOfDices一个骰子对象(其中的方式为界),如果你想分配你需要的所有骰子对象:
void Handler::rollDices(){
Dice **allDices = new Dice*[nrOfDices];
this->dices = allDices;
int count =1;
for (int i = 0; i < this->nrOfDices; i++)
{
dices[i] = new Dice(nrOfDices);
allDices[i]->toss();
cout << "Dice "<< count << ": " << allDices[i]->getValue() << endl;
count ++;
}
}
正如我告诉NathanOliver我做到了这一点,但我得到的错误:EXC_ARITHEMTIC – pottsork
如何使用现代C++?尝试这样的:
void Handler::rollDice()
{
std::vector<Dice> allDice(nrOfDice);
int count = 1;
for(const auto & d : allDice)
{
d.toss();
cout << "Die "<< count << ": " << d.getValue() << endl;
++count;
}
}
与你的问题没有关系,但“骰子”实际上是“死”的复数; “骰子”不正确。 –
哈哈对不起,英文不太好! – pottsork
“骰子”是“骰子”的复数这一事实,即使是母语为英语的人也很容易错过。另一个有趣的事实:“歌剧”是“作品”的复数。 –