4

この関数は完全に正常に動作するか、コンパイラ/デバッガが教えてくれます

void GUIManager::init(ToScreen* tS)
{
    toScreen = tS;
    loadFonts();
    GUI_Surface = SDL_SetVideoMode( toScreen->width, toScreen->height, 32, SDL_SWSURFACE );
    components.push_back(&PlainText("Hello, World!", font, -20, -40));

}

ここでは、最初の関数呼び出しでアクセス違反エラーが発生します。デバッガーには問題はありません。プログラムがここで停止するため、コンポーネント [0] をデバッグする機会がありません。

void GUIManager::draw() 
{
    // This line here is the problem
    components[0].draw(GUI_Surface);
    // This line here is the problem


    SDL_BlitSurface(GUI_Surface, NULL, toScreen->Screen_Surface, NULL);
}

必要な場合に備えて、これは私の「コンポーネント」です

boost::ptr_vector<GUIComponent> components;

他のコードが必要な場合はお知らせください。おそらく、PlainText、または GUIComponent のものです。

4

1 に答える 1

6

この行の直後に寿命を終了する一時的なポインタをプッシュする代わりに:

components.push_back(&PlainText("Hello, World!", font, -20, -40));

次の限り存在する動的オブジェクトをプッシュする必要がありますcomponents

components.push_back(new PlainText("Hello, World!", font, -20, -40));

ドキュメントを参照してください: http://www.boost.org/doc/libs/1_51_0/libs/ptr_container/doc/ptr_sequence_adapter.html#modifiers

void push_back( T* x ); 
    Requirements: x != 0 
    Effects: Inserts the pointer into container and takes ownership of it
    Throws: bad_pointer if x == 0
    Exception safety: Strong guarantee
于 2012-09-30T01:02:13.520 に答える