首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Box2d引擎作为std::向量

Box2d引擎作为std::向量
EN

Stack Overflow用户
提问于 2018-04-09 08:18:45
回答 1查看 126关注 0票数 0

像往常一样,用“物理a”创建box2d引擎。在这个例子中,这很好。但是,如果我们以std::myphysics.push_back({});的形式添加一个新实例,那么在执行二进制文件后,命令行上会显示以下错误:

双自由或腐败(!prev)中止(核心倾弃)

我完全不知道这个消息意味着什么,或者box2d引擎向量的问题是什么。以下是源代码:

代码语言:javascript
复制
// g++ -std=c++14 -lBox2D rrt.cpp
#include <Box2D/Box2D.h>
#include <vector>

class Physics {
public:
  b2World world{b2Vec2(0.f, 9.8f)};
};

class RRT {
public:
  std::vector<Physics> myphysics;
  RRT() {
    myphysics.push_back({}); 
    //Physics a;
  }
};

int main()
{ 
  RRT myrrt;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-11 03:13:31

问题在本质上是,b2World并不是设计为可复制的。

我只需使用以下代码块就可以复制一个双空闲的代码:

代码语言:javascript
复制
{
    b2World woo{b2Vec2(0.f, 9.8f)};
    b2World poo{woo};
}

这个问题可以通过源代码分析来识别。

查看一下b2World类,我们可以看到它没有用户定义的复制构造函数,也没有用户定义的副本分配方法。此外,代码不使用任何机制来阻止编译器定义这些机制。因此,编译器遵循特殊成员函数的规则,并自动生成复制构造函数和复制赋值操作符。这两个自动生成的方法都不知道如何处理b2World导致分配的任何动态分配内存(比如通过b2BroadPhase实例的组合)。这些自动生成的方法只需调用组件实例的复制方法,在本例中,这些方法将生成指向分配内存的任何指针来复制这些地址。然后,在销毁时,类似于b2BroadPhase类的析构函数调用为原始实例分配的内存的C库free函数,并对每个副本调用一次。

Bam!双人免费!

如果您想知道,下面是一些避免这个问题的方法:

  1. 不要做任何调用编译器定义的b2World复制构造函数或复制赋值操作符的操作。例如,不要使用b2World实例的向量,而是让它成为指向b2World实例的指针的向量。您可以将Physics类的world成员定义为:std::unique_ptr<b2World> world{std::make_unique<b2World>(b2Vec2(0.f, 9.8f))};。如果您不介意重新构建Box2D,您还可能希望添加这些特殊函数的显式删除定义,以帮助避免这些复制操作(只需将行:b2World(const b2World& o) = delete; b2World& operator=(const b2World&) = delete;添加到其头文件中的b2World类定义中即可)。
  2. 更新Box2D代码以正确处理副本构造和副本分配。然而,在我看来,要正确地做到这一点要比选项1难得多。
  3. 使用另一个物理引擎,用于支持复制构造和副本分配。无耻的插头:我倾向于PlayRho作为这样一种选择。它基本上是Box2D的派生工作(叉子)。PlayRho也不是没有任何问题,但是除了支持复制之外,它还有其他特性,并且有超过99%的单元测试覆盖率。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49728385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档