我遇到了这个 C6262 警告:“函数使用堆栈的‘103820’字节。考虑将一些数据移动到堆。”当我在 Visual Studio 2022 上尝试 Box2D 版本 2.4.1 时。此警告在我的主要功能上突出显示:
#include <box2d/box2d.h>
#include <cstdio>
// initialize gravity vector
const b2Vec2 GRAVITY(0.f, -10.f);
int main() {
// create new world
b2World world(GRAVITY);
// define ground box
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0.f, -10.f);
// set ground to be a rigid body so that it is immovable
b2Body* groundBody = world.CreateBody(&groundBodyDef);
// sets shape of the ground to be rectangular
// length of groundBox is 100 units
// height of groundBox is 20 units
b2PolygonShape groundBox;
groundBox.SetAsBox(50.f, 10.f);
// bind ground shape to ground rigid body
groundBody->CreateFixture(&groundBox, 0.f);
// define dynamic body
// setting type to dynamic body allows it to move
// in response to forces
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(0.f, 4.f);
b2Body* body = world.CreateBody(&bodyDef);
// set shape of the dynamic box to be a square
// size is 2 units
b2PolygonShape dynamicBox;
dynamicBox.SetAsBox(1.f, 1.f);
// define a fixture for the dynamic box
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
fixtureDef.density = 1.f;
fixtureDef.friction = 0.3f;
// bind fixture to dynamic body
body->CreateFixture(&fixtureDef);
// declare time step
// at each time step, the engine will do the physics math
// (it's like calculating each point on the graph)
const float TIME_STEP = 1.f / 60.f;
// declare number of iterations to iterate
// all constraints to achieve accurate results
const int32 VELOCITY_ITERATIONS = 6;
const int32 POSITION_ITERATIONS = 2;
// begin simulation loop
for (int32 i = 0; i < 60; i++) {
world.Step(TIME_STEP, VELOCITY_ITERATIONS, POSITION_ITERATIONS);
b2Vec2 position = body->GetPosition();
float angle = body->GetAngle();
printf("%4.2f %4.2f %4.2f\n", position.x, position.y, angle);
}
world.DestroyBody(body);
world.DestroyBody(groundBody);
body = NULL;
groundBody = NULL;
return 0;
}
值得指出的是,今天我打开这个项目的解决方案时出现了警告消息。昨天我在检查多次执行代码后是否出现此消息时,没有出现该消息。
这不是我第一次遇到这个错误,因为我在遵循文档中的 HelloBox2D 教程时第一次使用相同版本的 Box2D 时也遇到了这个错误。上面的代码片段实际上是按照教程进行操作的结果。当我在我的 C++ 游戏(我目前正在开发)上实现 Box2D 时,也出现了同样的警告。到目前为止,代码没有导致任何崩溃,但我有一种感觉,当我继续添加更多主体时,它最终可能会崩溃。
我尝试将堆栈提交大小和堆栈保留大小增加到 1048576 和 2097152,但它并没有抑制错误。我假设这个错误是由
b2World world
对象引起的,因为该行单独使用了 103288 字节。
这已经困扰我几天了,所以最好忽略这个警告吗?如果不是,我该如何解决这个问题?
您不应忽视该警告。
堆栈通常相当小,在上面放置一个大对象会让您面临堆栈溢出的风险,程序将无法从中恢复。
您应该按照建议识别大对象并将其放置在堆上。
最简单的方法是
new
(以及在程序退出之前 delete
)。