假设我想存储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 *的类型流。这能让我们看到什么吗?
发布于 2009-11-27 04:38:37
在查看了您的代码之后,我发现了这个问题。当您在应用程序中获得任何中断时,需要查看的是"Autos“选项卡或”局部变量“选项卡。在这里,您将注意到关于this指针的一些内容:它是空的!
这意味着调用AddSprite的实例不存在。这是您的SpriteManager,我看到它是一个单例。在您的主目录中,您不会创建它的实例。
我得做几件事才能让它起作用。我在Main.cpp中包括了Main.cpp,并添加了CreateInstance调用:
SpriteManager::CreateInstance();唯一的问题是,与其他单例一样,您已经声明了构造函数/析构函数私有,但从未定义它们,所以我也这样做了:
SpriteManager::SpriteManager(){}
SpriteManager::~SpriteManager(){} 在这些变化之后,它“起了作用”。这是用引号表示的,因为您的问题已经解决了,但是后面的代码m_GameManager->SetWagon(m_Wagon);中有另一个错误。
在这里,m_GameManager没有初始化。我取消了m_GameManager = GameManager::GetInstance();在LudoEngine.cpp第43行的注释,这使我们陷入了和以前一样的问题,从来没有调用过CreateInstance。我在main中添加了必要的标头,称为create方法。这解决了问题,你的引擎运行(很酷的演示,也!)
在ErrorLogger::LogError中,出口出现了一次崩溃,因为ErrorLogger为null。它是在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;
}因为这遗漏了“哪个单例?”的重要信息,所以您总是可以尝试在其中添加类型信息:
#include <typeinfo>
// ...
std::cerr << "Warning, late creation of singleton: "
<< typeid(T).name() << std::endl;想在里面取一些类型的名字。
最后,可以使用delete 0,不需要选中的delete宏。
为了澄清,您有LUDO_SAFE_DELETE,它在调用delete之前检查它是否为null。在C++中,删除null没有任何效果,因此不需要检查。您的安全删除的所有实例都可以替换为您的LUDO_DELETE。
发布于 2009-11-27 00:00:18
密码在我看来没问题。但是,您正在向量中存储指向ID3DXSprite的指针。这是怎么分配的?是否可能已取消了sprite的分配,从而使向量最终持有无效的指针,然后尝试引用指针?
https://stackoverflow.com/questions/1805666
复制相似问题