像往常一样,用“物理a”创建box2d引擎。在这个例子中,这很好。但是,如果我们以std::myphysics.push_back({});的形式添加一个新实例,那么在执行二进制文件后,命令行上会显示以下错误:
双自由或腐败(!prev)中止(核心倾弃)
我完全不知道这个消息意味着什么,或者box2d引擎向量的问题是什么。以下是源代码:
// 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;
}发布于 2018-04-11 03:13:31
问题在本质上是,b2World并不是设计为可复制的。
我只需使用以下代码块就可以复制一个双空闲的代码:
{
b2World woo{b2Vec2(0.f, 9.8f)};
b2World poo{woo};
}这个问题可以通过源代码分析来识别。
查看一下b2World类,我们可以看到它没有用户定义的复制构造函数,也没有用户定义的副本分配方法。此外,代码不使用任何机制来阻止编译器定义这些机制。因此,编译器遵循特殊成员函数的规则,并自动生成复制构造函数和复制赋值操作符。这两个自动生成的方法都不知道如何处理b2World导致分配的任何动态分配内存(比如通过b2BroadPhase实例的组合)。这些自动生成的方法只需调用组件实例的复制方法,在本例中,这些方法将生成指向分配内存的任何指针来复制这些地址。然后,在销毁时,类似于b2BroadPhase类的析构函数调用为原始实例分配的内存的C库free函数,并对每个副本调用一次。
Bam!双人免费!
如果您想知道,下面是一些避免这个问题的方法:
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类定义中即可)。https://stackoverflow.com/questions/49728385
复制相似问题