假设我想存储一个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。这有什么可以解决的吗?

有帮助吗?

解决方案

查看完代码后,我发现了问题。当你在应用程序中出现任何中断时要注意的是<!> quot; Autos <!> quot;选项卡或“本地”选项卡。在这里你会注意到关于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,这使我们遇到了与以前相同的问题,没有调用ErrorLogger::LogError。我在main中添加了必要的头文件,称为create方法。这解决了问题,你的引擎运行了(很酷的演示!)

退出时出现崩溃,在ErrorLogger中,因为LudoMemory为空。它是在GetInstance的析构函数中调用的,但我会留给你一个。 :)

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

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

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

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

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之前检查它是否为null。在C ++中,删除null无效,因此不需要检查。您的安全删除的所有实例都可以仅用您的LUDO_DELETE替换。

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top