所以,我有这些函数(Game
继承自GameInterface
;它们目前都没有任何目的,我只是在测试我的想法是否可以完成。):< / p>
vector<GameInterface*> Game::generateChildren() {
vector<GameInterface*> vgf;
// make 10 copies of this object, increasing the 'npawns' attribute
Game* gi = this;
for (int i = 0; i < 10; ++i) {
gi = new Game(*gi);
vgf.push_back(gi);
++gi->npawns;
}
return vgf;
}
和
const int Library::getBestMovement(GameInterface* gf) const {
vector<GameInterface*> vgf = gf->generateChildren();
int nchildren = vgf.size();
// outputs "child #i has (i+1) pawns" for i in 0..9
for (int i = 0; i < nchildren; ++i) {
cout << "child #" << i << " has " << vgf[i]->num_of_pawns() << " pawns" << endl;
}
// missing some dynamic memory management (deleting the pointers in vgf)
return 0;
}
由于“child”对象是使用new
创建的,并且getBestMovement
结束后将不再使用它们,我假设我必须释放vgf
内的指针。
问题在于我已尝试过
中的所有内容for (auto it = vgf.begin(); it != vgf.end(); ++it)
delete *it;
使用智能指针,但在执行程序时总是得到相同的调试断言错误:_BLOCK_TYPE_IS_VALID(pHead-&gt; nBlockUse)。
关于问题是什么的任何想法?感谢
编辑:
好的,我有class Game : virtual public GameInterface
。删除了virtual
关键字,现在可以正常使用了。我不知道为什么(我甚至不知道他virtual
关键字做了什么;我主要测试的是因为我对这门语言不熟悉,所以请耐心等待我)
编辑2:
强制GameInterface
析构函数是虚拟的似乎是正确的解决方案。
答案 0 :(得分:0)
以下代码应该含糊不清:
#include <memory>
#include <vector>
struct GameInterface
{
virtual ~GameInterface() {}
virtual std::vector<std::unique_ptr<GameInterface>> generateChildren() = 0;
};
struct Game : GameInterface
{
std::vector<std::unique_ptr<GameInterface>> generateChildren() override
{
std::vector<std::unique_ptr<GameInterface>> result;
for (int i = 0; i != 10; ++i)
{
result.emplace_back(new Game(result.empty()
? *this
: *result.back()));
++result.back()->npawns;
}
return result;
}
};
int getBestMovement(GameInterface* gf)
{
auto v = gf->generateChildren();
// ...
return 0;
}