2015-04-12 10 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; Inorder для удаления объекта он выходит из строя

с этим сообщением

Необработанное исключение в 0x55111BBE (SFML-графики-й -2.dll) в SpaceDroid.exe: 0xC0000005: Место считывания нарушения доступа 0xFEEEFEF2.

ответ

0

Мое предположение заключается в том, что вы удаляете rob, указатель, а затем пытаетесь снова получить доступ к указателю void в той же проверке в следующий раз. Следовательно, нарушение прав доступа.

Что касается решения, вы можете проверить, равен ли равен nullptr (при условии, что C++ 11), или даже лучше было бы пересмотреть свое использование исходных указателей вместе.

Я не знаю контекста вашей программы, если рок - это то, что получается и часто удаляется, подумайте о том, чтобы держать ОДНОГО объекта текстуры скалы в постоянном «менеджере текстур», а затем создавать и удалять ваши скальные спрайты/объекты в контейнер. Возможно, есть «rockList» или «entityList», который зацикливается через каждый кадр. Тогда удаление становится тривиальным «.erase»

+1

Я думаю, что ваш главный вопрос верен, но в вашем ответе есть две вещи, которые неточны. Во-первых, указатель «void» не является правильным термином. Вероятно, вы имели в виду * доступ к ** ** висящему ** указателю *. Во-вторых, это скорее всего вопрос фразировки, но, проверяя равенство с 'nullptr' (или' 0' в C++ 98), вам действительно нужно установить ваш указатель на 'nullptr' в какой-то момент, как правило, вы делаете' delete ptr; ptr = nullptr; '. – Hiura

Смежные вопросы