存储在向量中的C ++自由指针

时间:2015-04-06 16:54:42

标签: c++ pointers vector runtime-error delete-operator

所以,我有这些函数(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析构函数是虚拟的似乎是正确的解决方案。

1 个答案:

答案 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;
}