2015-04-12 23 views
0

我Rockclass如何刪除對象在SFML

void rock::create(sf::Vector2f pos) 
{ 
    tex.loadFromFile("Images/meteorBig.png"); 
    spr.setTexture(tex); 
    spr.setPosition(sf::Vector2f(pos.x, pos.y)); 
    std::cout << pos.x << std::endl; 
} 

void rock::remove() 
{ 

} 

void rock::draw(sf::RenderWindow &window) 
{ 
    spr.move(0.0f, +.05f); 
    window.draw(spr); 
} 

我的主類

rock* rob = new rock(); 

rob->create(sf::Vector2f(300.0f + rand() % 50 + 10, 0.0f)); 

和渲染我有

rob->draw(mywindow); 

,並在碰撞檢查我有

if (bo.sprite.getGlobalBounds().intersects(rob->spr.getGlobalBounds())) 
    { 
     cout << "Collides" << endl; 
     delete rob; 
    } 

當過我的子彈打在岩石上,其調試碰撞完美的,但是當我使用delete rob;序刪除對象崩潰

與此消息

在0x55111BBE未處理的異常(SFML圖形-d -2.dll) SpaceDroid.exe:0xC0000005:訪問衝突讀取位置 0xFEEEFEF2。

回答

0

我的假設是你刪除了rob,你的指針,然後再次嘗試在下次同一次檢查時訪問void指針。因此訪問衝突。

關於解決方案,你可以檢查rob是否等於nullptr(假設C++ 11),或者,更好的辦法是重新考慮你對原始指針的使用。

我不知道你的程序的上下文,如果rock是經常被製作和刪除的東西,可以考慮在一個持久化的「紋理管理器」中保存一個岩石紋理對象,然後創建並移除你的岩石精靈/對象一個容器。也許有一個循環遍歷每一幀的'rockList'或'entityList'。然後去除成爲一個小事'.erase'

+1

我認爲你的主要觀點是正確的,但有兩件事情在你的答案中是不精確的。首先,「空白」指針不是正確的術語。你可能意思是*來訪問一個**搖晃的**指針*。其次,它可能只是一個短語的問題,但是在某些時候你實際上需要將指針設置爲'nullptr',通常你會'刪除ptr',並且檢查'nullptr'(或C++ 98中的'0')是否相等。 ptr = nullptr;'。 – Hiura