【问题标题】:How to delete an object in sfml如何删除 sfml 中的对象
【发布时间】:2015-06-17 16:12:12
【问题描述】:

我的摇滚课

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-graphics-d-2.dll) 中的未处理异常 SpaceDroid.exe: 0xC0000005: 访问冲突读取位置 0xFEEEFEF2.

【问题讨论】:

    标签: visual-c++ sfml


    【解决方案1】:

    我的假设是您删除了 rob,您的指针,然后在下一次相同的检查中再次尝试访问 void 指针。因此访问冲突。

    至于解决方案,您可以检查 rob 是否等于 nullptr(假设 c++11),或者更好的是重新考虑一起使用原始指针。

    我不知道您的程序的上下文,如果岩石是经常制作和删除的东西,请考虑在持久的“纹理管理器”中保存一个岩石纹理对象,然后在一个容器。也许有一个循环通过每一帧的“rockList”或“entityList”。然后删除就变成了一个微不足道的'.erase'

    【讨论】:

    • 我认为您的主要观点是正确的,但您的回答中有两点不准确。首先,“void”指针不是正确的术语。您可能的意思是访问一个悬空指针。其次,这可能只是一个措辞问题,但要检查与nullptr(或C++98 中的0)是否相等,您实际上需要在某个时候将指针设置为nullptr,通常您会使用delete ptr; ptr = nullptr;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2013-10-28
    • 2011-01-12
    • 1970-01-01
    相关资源
    最近更新 更多