2015-04-12 43 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