如何存储LPD3DXSPRITE对象的向量?

时间:2009-11-26 21:13:36

标签: c++ vector directx

假设我想存储一个LPD3DXSPRITE对象的向量。声明此代码的行将是std::vector<LPD3DXSPRITE> sprites;我应该能够使用:

创建我的精灵
LPD3DXSPRITE sprite = NULL;
D3DXCreateSprite(myRenderingDevice, &sprite);

最后,我应该能够像这样添加到矢量中:

sprites.push_back(sprite);

至少在我的理解下,这应该是合情合理的。但是,这会编译但会产生运行时错误。为什么是这样?我错了吗?我该如何解决?

修改

这也可能有所帮助。调用堆栈为此函数生成vector<ID3DXSprite *, std::allocator<ID3DXSprite *>>::push_back(ID3DXSprite * const &_Val=0x0036fd38即被调用的函数。这不是它传递的向量 但是,LPD3DXSPRITE只是ID3DXSprite *的typedef。这有什么可以解决的吗?

2 个答案:

答案 0 :(得分:3)

查看完代码后,我发现了问题。当您在应用程序中出现任何中断时,需要注意的是“Autos”选项卡或Locals选项卡。在这里你会注意到this指针的一些内容:它是空的!

这意味着正在调用AddSprite的实例不存在。这是你的SpriteManager,我看到它是一个单身人士。在您的主体中,您不会创建它的实例。

我必须做几件事才能让它发挥作用。我在"LudoRenderer/SpriteManager.h"中添加了Main.cpp,并添加了CreateInstance来电:

SpriteManager::CreateInstance();

唯一的问题是你已经将构造函数/析构函数声明为私有,就像其他单例一样,但从未定义它们,所以我也这样做了:

SpriteManager::SpriteManager(){}
SpriteManager::~SpriteManager(){} 

在这些变化之后,它“起作用”。这是引号,因为您的问题已解决,但代码m_GameManager->SetWagon(m_Wagon);中稍后会出现另一个错误。

此处,m_GameManager未初始化。我在m_GameManager = GameManager::GetInstance();的第43行取消注释LudoEngine.cpp,这使我们遇到与以前相同的问题,从未调用CreateInstance。我在main中添加了必要的头文件,称为create方法。这解决了问题,你的引擎运行了(很酷的演示!)

ErrorLogger::LogError退出时发生了崩溃,因为ErrorLogger为空。它是在LudoMemory的析构函数中调用的,但是我将为你留下这个。 :)

现在,我提出的两个提示会有所帮助。首先是关于我们正在解决的问题。通常情况下,单身人士如果还没有自己就会创造自己。我会将您的单身GetInstance更改为以下内容:

static T *GetInstance ( )
{
    if (!m_Singleton) // or == NULL or whatever you prefer
    {
        CreateInstance();
    }

    return m_Singleton; // not sure what the cast was for
}

这将强制创建单例(如果尚未创建)。现在,如果您希望用户在尝试CreateInstance之前致电GetInstance,您可以添加某种警告:

static T *GetInstance ( )
{
    if (!m_Singleton) // or == NULL or whatever you prefer
    {
        CreateInstance();
        std::cerr << "Warning, late creation of singleton!" << std::endl;

        // or perhaps:
        ErrorLogger::GetInstance()->
                        LogError(L"Warning, late creation of singleton!");
    }

    return m_Singleton;
}

由于这会遗漏重要信息“哪个单身人士?”,您可以随时尝试将typeinfo添加到其中:

#include <typeinfo>

// ...

std::cerr << "Warning, late creation of singleton: "
          << typeid(T).name() << std::endl;

尝试在那里获得一些类型名称。

最后,delete 0没关系,不需要检查删除的宏。

为了澄清,你有LUDO_SAFE_DELETE,它会在调用delete之前检查它是否为null。在C ++中,删除null无效,因此不需要检查。您的安全删除的所有实例都可以仅用您的LUDO_DELETE替换。

答案 1 :(得分:0)

代码看起来不错。 但是你在向量中存储了一个指向ID3DXSprite的指针。这怎么解除分配? 精灵是否可能已被解除分配,因此向量最终会持有无效指针,然后尝试引用指针?