gpt4 book ai didi

c++ - 使用 'new'创建实例后出现堆栈溢出错误

转载 作者:行者123 更新时间:2023-11-30 02:11:57 24 4
gpt4 key购买 nike

  • 编辑 - 代码在这里看起来很奇怪,所以我建议直接在给定的链接中查看文件。

在处理我的引擎时,我遇到了一个我无法解决的问题。希望在不进行任何重大修改的情况下解决此问题,代码如下。

void Block::DoCollision(GameObject* obj){
obj->DoCollision(this);
}

这就是堆栈溢出发生的地方。在我使用 new 关键字创建该类的两个实例之前,此应用程序运行良好。如果我只有该类的 1 个实例,它就可以正常工作。

Block* a = new Block(0, 0, 0, 5);
AddGameObject(a);
a = new Block(30, 0, 0, 5);
AddGameObject(a);

这些参数只是 x、y、z 和大小。

预先检查代码。只有具有匹配的 Collisonflag 和碰撞类型的对象才会触发 DoCollision();功能。

((*list1)->m_collisionFlag & (*list2)->m_type)

也许我的支票搞砸了。我在这里附上了相关文件http://celestialcoding.com/index.php?topic=1465.msg9913;topicseen#new .您无需注册即可下载它们。主要嫌疑人,我还在下面粘贴了代码。

来自 GameManager.cpp

void GameManager::Update(float dt){
GameList::iterator list1;

for(list1=m_gameObjectList.begin(); list1 != m_gameObjectList.end(); ++list1){
GameObject* temp = *list1;

// Update logic and positions
if((*list1)->m_active){
(*list1)->Update(dt);
// Clip((*list1)->m_position); // Modify for bounce affect
} else continue;

// Check for collisions
if((*list1)->m_collisionFlag != GameObject::TYPE_NONE){
GameList::iterator list2;
for(list2=m_gameObjectList.begin(); list2 != m_gameObjectList.end(); ++list2){
if(!(*list2)->m_active)
continue;
if(list1 == list2)
continue;
if( (*list2)->m_active &&
((*list1)->m_collisionFlag & (*list2)->m_type) &&
(*list1)->IsColliding(*list2)){
(*list1)->DoCollision((*list2));
}
}
}
if(list1==m_gameObjectList.end()) break;
}
GameList::iterator end    = m_gameObjectList.end();
GameList::iterator newEnd = remove_if(m_gameObjectList.begin(),m_gameObjectList.end(),RemoveNotActive);
if(newEnd != end)
       m_gameObjectList.erase(newEnd,end);
}

void GameManager::LoadAllFiles(){
LoadSkin(m_gameTextureList, "Models/Skybox/Images/Top.bmp", GetNextFreeID());
LoadSkin(m_gameTextureList, "Models/Skybox/Images/Right.bmp", GetNextFreeID());
LoadSkin(m_gameTextureList, "Models/Skybox/Images/Back.bmp", GetNextFreeID());
LoadSkin(m_gameTextureList, "Models/Skybox/Images/Left.bmp", GetNextFreeID());
LoadSkin(m_gameTextureList, "Models/Skybox/Images/Front.bmp", GetNextFreeID());
LoadSkin(m_gameTextureList, "Models/Skybox/Images/Bottom.bmp", GetNextFreeID());
LoadSkin(m_gameTextureList, "Terrain/Textures/Terrain1.bmp", GetNextFreeID());
LoadSkin(m_gameTextureList, "Terrain/Textures/Terrain2.bmp", GetNextFreeID());
LoadSkin(m_gameTextureList, "Terrain/Details/TerrainDetails.bmp", GetNextFreeID());
LoadSkin(m_gameTextureList, "Terrain/Textures/Water1.bmp", GetNextFreeID());




Block* a = new Block(0, 0, 0, 5);
AddGameObject(a);
a = new Block(30, 0, 0, 5);
AddGameObject(a);
Player* d = new Player(0, 100,0);
AddGameObject(d);
}



void Block::Draw(){

glPushMatrix();
glTranslatef(m_position.x(), m_position.y(), m_position.z());
glRotatef(m_facingAngle, 0, 1, 0);
glScalef(m_size, m_size, m_size);
glBegin(GL_LINES);
glColor3f(255, 255, 255);
glVertex3f(m_boundingRect.left, m_boundingRect.top, m_position.z());
glVertex3f(m_boundingRect.right, m_boundingRect.top, m_position.z());
glVertex3f(m_boundingRect.left, m_boundingRect.bottom, m_position.z());
glVertex3f(m_boundingRect.right, m_boundingRect.bottom, m_position.z());

glVertex3f(m_boundingRect.left, m_boundingRect.top, m_position.z());
glVertex3f(m_boundingRect.left, m_boundingRect.bottom, m_position.z());
glVertex3f(m_boundingRect.right, m_boundingRect.top, m_position.z());
glVertex3f(m_boundingRect.right, m_boundingRect.bottom, m_position.z());
glEnd();
// DrawBox(m_position.x(), m_position.y(), m_position.z(), m_size, m_size, m_size, 8);
glPopMatrix();
}

void Block::DoCollision(GameObject* obj){
GameObject* t = this;   // I modified this to see for sure that it was causing the mistake.
// obj->DoCollision(NULL); // Just revert it back to
/*
void Block::DoCollision(GameObject* obj){  
  obj->DoCollision(this);  
}  
*/

}

最佳答案

堆栈溢出通常来自无限递归。我在解析你的问题时遇到了问题,但这是一个猜测:

void Block::DoCollision(GameObject* obj){
if (this != obj) {
obj->DoCollision(this);
}
}

关于c++ - 使用 'new'创建实例后出现堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2573541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com