C ++矢量大小为零

时间:2015-03-31 16:37:21

标签: c++ multithreading sdl sdl-2

我正在尝试创建一个函数,它在displayobject对象的向量中呈现所有内容(在另一个线程上)。我正在使用SDL线程。

这是displayobject.h:

class DisplayObject
{
protected:
    int width;
    int height;
    int x;
    int y;
    SDL_Texture* texture;
    SDL_Renderer* renderer;

public:
    ~DisplayObject();
    int getX();
    void setX(int x);
    int getY();
    void setY(int y);
    int getWidth();
    void setWidth(int width);
    int getHeight();
    void setHeight(int height);
    SDL_Texture* getTexture();
    SDL_Renderer* getRenderer();
};

在graphics.h中,我有以下变量:

std::vector<DisplayObject> imgArr;
SDL_Thread* renderThread;
static int renderLoop(void* vectorPointer);

此代码位于图形构造函数中:

TextLabel textLabel(graphics->getRenderer(), 300, 80, "Hallo Welt", 50,       Color(255, 0, 255), "Xenotron.ttf");
//TextLabel inherits from DisplayObject
imgArr.push_back(textLabel);
renderThread = SDL_CreateThread(Graphics::renderLoop, "renderLoop", &imgArr);

这是渲染循环功能:

int Graphics::renderLoop(void* param)
{
    int counter = 0;
    bool rendering = true;
    std::vector<DisplayObject>* imgArr = (std::vector<DisplayObject>*)param;

    while (rendering)
    {
        cout << imgArr->size() << endl;

        counter++;
        if (counter > 600)
        {
            rendering = false;
        }

        SDL_Delay(16);
    }

    return 0;
}

问题是它只在控制台中打印0。为什么这样做?因为我将对象推入其中,所以应该写1。

1 个答案:

答案 0 :(得分:3)

TextLabel插入std::vector<DisplayObject>时,向量中存储的内容不是原始TextLabel对象,而是DisplayObject复制构造的TextLabel 1}}。您要做的是使用TextLabel创建new,存储指针,并在不再需要时调用delete

最佳解决方案是使用boost::ptr_vector<DisplayObject>代替 - 当您从中删除对象时,它会自动调用deletehttp://www.boost.org/doc/libs/1_57_0/libs/ptr_container/doc/ptr_container.html

如果您不能使用Boost,但可以使用C ++ 11,则可以使用std::vector<std::unique_ptr<DisplayObject>>