预期(最多)堆溢出时堆栈溢出
Stack overflow when expecting (at most) heap overflow
我在这里遇到了一个对我来说很奇怪的问题,我故意更改了我的程序,使其使用动态内存,因为我之前遇到过堆栈错误。内存密集型部分已更改为动态,但我仍然遇到堆栈溢出,虽然我预计堆溢出,但我有足够的 RAM,所以即使是这些也不应该发生。
头文件:
#ifndef __FPS_h_
#define __FPS_h_
#include "BaseApplication.h"
#include <Ogre/OgreLogManager.h>
#include <Ogre/OgreInstanceManager.h>
#include <btBulletDynamicsCommon.h>
#include <btIDebugDraw.h>
#include "BtOgreExtras.h"
#include "BtOgreGP.h"
#include "btOgrePG.h"
class FPS : public BaseApplication
{
public:
FPS(void);
virtual ~FPS(void);
protected:
virtual void createScene(void);
virtual void createCamera(void);
virtual void createViewports(void);
virtual bool frameRenderingQueued(const Ogre::FrameEvent &evt);
void initializePhysics(void);
void initializeGraphics(void);
void initializeGraphicsBase(void);
void initializeGraphicsGround(void);
void initializeGraphicsTiles(void);
void initializeGraphicsRobot(void);
private:
Ogre::InstanceManager* tileInstanceManager;
Ogre::SceneNode*** tileSceneNode[300][300];
btRigidBody*** tileRigidBody[300][300];
//Ogre::SceneNode* tileSceneNode;
//btRigidBody* tileRigidBody;
Ogre::SceneNode* robotSceneNode;
btRigidBody* robotRigidBody;
btDiscreteDynamicsWorld* dynamicsWorld;
BtOgre::DebugDrawer* debugDrawer;
};
#endif // #ifndef __FPS_h_
源文件的一部分:
void FPS::initializeGraphicsTiles() {
//tile instance manager
uint16_t flags = Ogre::InstanceManagerFlags::IM_USEALL;
tileInstanceManager = mSceneMgr->createInstanceManager("InstanceManager", "tile.mesh", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::InstanceManager::HWInstancingVTF, 400, flags);
//fake tile
Ogre::Entity* entFakeTile = mSceneMgr->createEntity("Tile", "tile.mesh");
//initialize arrays
**tileSceneNode = new Ogre::SceneNode**[300];
**tileRigidBody = new btRigidBody**[300];
//tile
for (int x = 0; x <= 300; x++) {
*tileSceneNode[x] = new Ogre::SceneNode**[300];
*tileRigidBody[x] = new btRigidBody**[300];
for (int z = 0; z <= 300; z++) {
Ogre::InstancedEntity* entTile = tileInstanceManager->createInstancedEntity("Examples/Instancing/VTF/HW/Robot");
entTile->setCastShadows(true);
Ogre::SceneNode* tempNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
tempNode->attachObject(entTile);
**tileSceneNode[x][z] = tempNode;
BtOgre::StaticMeshToShapeConverter converter(entFakeTile);
btConvexHullShape* mShape = converter.createConvex();
btScalar mass = 100;
btVector3 inertia;
BtOgre::RigidBodyState* state = new BtOgre::RigidBodyState(tempNode);
btRigidBody* tempBody = new btRigidBody(mass, state, mShape, inertia);
btTransform originalTransform;
tempBody->getMotionState()->getWorldTransform(originalTransform);
btVector3 originalOrigin = originalTransform.getOrigin();
originalOrigin.setX(originalOrigin.getX() + (x * 10.0));
originalOrigin.setZ(originalOrigin.getZ() + (z * 10.0));
originalTransform.setOrigin(originalOrigin);
tempBody->getMotionState()->setWorldTransform(originalTransform);
dynamicsWorld->addRigidBody(tempBody);
**tileRigidBody[x][z] = tempBody;
}
}
}
如果我删除(或大幅减少)双精度数组,那么错误就消失了。
编辑:我知道我还没有清理内存,首先想让应用程序实际运行。
查看sizeof(FPS)
.我猜它很大(>1MB),并且您正在堆栈上分配FPS
本身的实例,对吗?在您使用FPS app;
的地方,将其替换为std::unique_ptr<FPS> app_ptr( new FPS );
,这应该可以解决您的问题。
FPS
结构的大小约为 1.4 MiB(sizeof(void *) * 2 * 300 * 300),如果您真的需要指向指针到指向类的指针的 2D 数组,我怀疑设计决策很糟糕。
改用std::vector< std::vector< Ogre::SceneNode > > tileSceneNode;
应该大大减少你的记忆麻烦
我想你有点困惑。第一行声明了一个 300x300 的指针到指针到指针到磁贴 RigidBody 的数组。
btRigidBody*** tileRigidBody[300][300];
因此,您有 90,000 个 3* 指针。但是,然后你尝试做这样的事情,假设你有一个指向 300 个指针到 300 个指针的指针......
**tileRigidBody = new btRigidBody**[300];
for (int x = 0; x <= 300; x++) {
*tileSceneNode[x] = new Ogre::SceneNode**[300];
*tileRigidBody[x] = new btRigidBody**[300];
改用std::vector<>
,事情会变得更加清晰!
如果你必须用数组来做(叹气...),那么从这样的事情开始:-
btRigidBody** tileRigidBody[300]; // 300 pointers to dynamic arrays
你的"init"看起来像这样(忽略 sceneNode 的东西,这是类似的):-
for (int x = 0; x < 300; x++)
{
tileRigidBody[x] = new btRigidBody*[300]; // create array of 300 pointers.
for (int z = 0; z < 300; z++)
{
....
btRigidBody* tempBody = new btRigidBody(mass, state, mShape, inertia);
tileRigidBody[x][z] = tempBody;
}
请注意要< 300
for 循环中的更改 - 您的代码溢出了数组。
警告 - 代码未经测试,但你应该明白这个想法。
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- C++ 对象数组堆栈溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 对象接收堆栈溢出异常 c++ 的排序向量
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- C++ 中递归期间的堆栈溢出
- 启动 dll 时 C# 环境堆栈溢出
- 在C++中使用数组时如何防止堆栈溢出?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 为什么堆栈溢出?如有建议,不胜感激
- 主函数执行时C++堆栈溢出异常
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 如何在Windows上报告堆栈缓冲区溢出
- 如何抑制来自 gcc 中地址清理器的堆栈缓冲区溢出
- 声明大数组时堆栈/堆溢出
- c++中栈溢出和分段错误的危险