Box2D:遇到 C6262 警告“函数使用堆栈的‘103820’字节。考虑将一些数据移动到堆。”在 main() 上

问题描述 投票:0回答:1

我遇到了这个警告

警告 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 字节。

这已经困扰我几天了,所以最好忽略这个警告吗?
如果不是,我该如何解决这个问题?

c++ stack-overflow box2d
1个回答
1
投票

您绝对不应该忽略该警告。

堆栈通常相当小,在上面放置一个大对象会让您面临

堆栈溢出的风险,程序将无法从中恢复。

您应该按照建议识别大对象并将其

放在堆上

最简单的方法是

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;

备注:

  1. 仅当您想保持其余代码不变时才需要最后一行。您可以直接使用

    pWorld

    ,但不要使用 
    .
     来访问成员,而是使用 
    ->

  2. 如果必须共享对象,您可以使用

    std::shared_ptr

    (与 std::make_shared
    ),而不是 
    std::unique_ptr

© www.soinside.com 2019 - 2024. All rights reserved.