【问题标题】:C++ vector storing base class pointers存储基类指针的 C++ 向量
【发布时间】:2012-08-10 03:42:22
【问题描述】:

好的,情况: 我正在使用一个我无法控制的库,它有一个方法 createSomeObject()。 此方法返回一个指向具有纯虚函数的抽象基类的指针,并且它没有复制构造函数,因此我不能自己实例化它也不能复制它(显然)。

我需要在一个向量中存储一些(比如 10 个),所以我尝试执行以下操作:

vector<AbstractBaseClass*> v(10);

for(int i = 0; i < 10; i++)
{
    v.push_back(library->createSomeObject());
}

一旦这个循环结束,向量就会被损坏的指针填充。

我尝试了以下方法:

vector<AbstractBaseClass*> v(10);

for(int i = 0; i < 10; i++)
{
    AbstractBaseClass* abc = library->createSomeObject();
    v.push_back(abc);
}

无济于事。我一定是疯了,或者在这里做错了什么。我环顾四周,但答案总是使用 boost::shared_ptr。可能是一个很好的解决方案,但我不能保证它会在构建它的机器上,所以我想避免使用代码打包 Boost。

我有什么遗漏吗?我觉得好像我只是忘记了一些简单的事情,因为我想不出其中一个不起作用的原因。

【问题讨论】:

    标签: c++ pointers stl vector


    【解决方案1】:

    当你这样做时:

    vector<AbstractBaseClass*> v(10);
    

    您已经创建了一个包含 10 个(NULL)指针的向量。因此,在您调用push_back 之后,您将拥有一个包含 20 个指针的向量,其中前 10 个是无效的。

    如果你事先知道尺寸:

    vector<AbstractBaseClass*> v(10);
    for(int i = 0; i < 10; i++)
    {
        v[i] = library->createSomeObject();
    }
    

    或者,或者,在创建一个空向量后调用reserve

    【讨论】:

    • 噢该死的我害怕这个:我是智障。计时器到时将接受。
    • > 10 个(悬空的)指针...你为什么称它们为悬空的?这些是 10 个 NULL 指针。
    • @KirillKobelev 我认为它们没有被初始化为 NULL。是吗?
    • @KirillKobelev :) MSVS 往往很奇怪。我并不是说它们不是,但标准引用算作证据,而不是编译器的行为。
    • 在我的辩护中,null 也悬而未决:P @KirillKobelev
    猜你喜欢
    • 2012-09-25
    • 2018-01-02
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多