我遇到了这个警告
警告 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
)。但在现代 C++ 中不推荐手动内存管理。
b2World world
(正如您所怀疑的),您可以使用
std::unique_ptr
(与 std::make_unique
):
#include <memory> // required for std::unique_ptr
// ...
std::unique_ptr<b2World> pWorld = std::make_unique<b2World>(GRAVITY);
b2World & world = *pWorld;
备注:
pWorld
,但不要使用
.
来访问成员,而是使用
->
。
std::make_shared
),而不是 std::unique_ptr
。