代码:
Block** blockArray = new Block*[numBlocks];
for (int i=0; i<numBlocks; i++)
{
fin >> a >> b;
blockArray[i]->setPosX(a);
blockArray[i]->setPosY(b);
}
问题:
当代码命中了blockArray [i] - &gt; setPosX(a)时; 它引发了一个未处理的异常。具体做法是:
Unhandled exception at 0x00BF45FB in Nglarsen.Hmwk.3.Assignment.exe: 0xC0000005: Access violation writing location 0xBAADF00D.
我能够解决这个问题的唯一方法是:
Block** blockArray = new Block*[numBlocks];
for (int i=0; i<numBlocks; i++)
{
blockArray[i]=new Block[1];
for(int j=0;j<1;j++)
{
fin >> a >> b;
blockArray[i][j].setPosX(a);
blockArray[i][j].setPosY(b);
}
}
但我知道有一种更好的方式我只是忘了这里的东西。 提前致谢
答案 0 :(得分:3)
假设Block
符合向量的要求,我会这样做。
std::vector<Block> blocks(numBlocks)
for (auto& block : blocks)
{
fin >> a >> b;
block.setPosX(a);
block.setPosY(b);
}
请注意精确缺少内存泄漏。
答案 1 :(得分:3)
你正在分配一个指针数组,但是这些指针指向什么,你需要再次迭代它们,并在它们上分配实际对象。
Block** blockArray = new Block*[numBlocks];
for (int i=0; i<numBlocks; i++)
{
blockArray[i] = new Block();
fin >> a >> b;
blockArray[i]->setPosX(a);
blockArray[i]->setPosY(b);
}
假设你想要二维数组:
Block** blockArray = new Block*[numBlocks];
for (int i=0; i<numBlocks; i++)
{
blockArray[i] = new Block[SIZE];
for (int j =0 ;j<SIZE;j++){
blockArray[i][j] = new Block();
fin >> a >> b;
blockArray[i][j]->setPosX(a);
blockArray[i][j]->setPosY(b);
}
}
答案 2 :(得分:1)
明显的“更好的方法”是使用std::vector
代替。由于您正在输入Block
个对象,因此通常可以通过重载operator>>
来直接支持它,而不是要求所有代码都知道其内部细节。
std::istream &operator>>(std::istream &is, Block &block) {
int a, b;
is >> a >> b;
block.setPosX(a);
block.setPosY(b);
return is;
}
std::vector<Block> blocks;
blocks.reserve(numBlocks);
std::copy_n(std::istream_iterator<Block>(fin), numBlocks,std::back_inserter(blocks));