我正在尝试将一些对象添加到相同类型的矢量中。 在标题中:
std::vector<Object_3D> balls_;
我正在尝试使用以下代码将对象推到向量的背面:
void S3DApp::InitGameObjects(){
int i;
Object_3D ball_;
for(i = 0; i < ball_count_/2; i++){
ball_.Init(platform_, "stripe.Obj");
ball_.SetScale(abfw::Vector3(0.2, 0.2, 0.2));
ball_.SetTranslation(abfw::Vector3((float)i, 1.0f, (float)i));
balls_.push_back(ball_);
}
}
init函数从目标文件加载模型:
void Object_3D::Init(abfw::Platform& platform_, const char *filename){
abfw::OBJLoader obj_loader;
obj_loader.Load(filename, platform_, model_);
mesh_instance_.set_mesh(model_.mesh());
transform_.SetIdentity();
mesh_instance_.set_transform(transform_);
position_ = transform_.GetTranslation();
}
我在第三次运行for for循环时遇到错误,因为调用了object_3d析构函数。但我不确定为什么。析构函数是调用Model :: Release()的地方,我认为它位于调用堆栈之上。这是调用堆栈:
s3d_app.exe!abfw::Model::Release() Line 26 C++
s3d_app.exe!Object_3D::~Object_3D() Line 9 C++
s3d_app.exe!Object_3D::`scalar deleting destructor'(unsigned int) C++
s3d_app.exe!std::allocator<Object_3D>::destroy<Object_3D>(Object_3D * _Ptr) Line 624 C++
s3d_app.exe!std::allocator_traits<std::allocator<Object_3D> >::destroy<Object_3D>(std::allocator<Object_3D> & _Al, Object_3D * _Ptr) Line 758 C++
s3d_app.exe!std::_Wrap_alloc<std::allocator<Object_3D> >::destroy<Object_3D>(Object_3D * _Ptr) Line 909 C++
s3d_app.exe!std::_Destroy_range<std::_Wrap_alloc<std::allocator<Object_3D> > >(Object_3D * _First, Object_3D * _Last, std::_Wrap_alloc<std::allocator<Object_3D> > & _Al, std::_Nonscalar_ptr_iterator_tag __formal) Line 89 C++
s3d_app.exe!std::_Destroy_range<std::_Wrap_alloc<std::allocator<Object_3D> > >(Object_3D * _First, Object_3D * _Last, std::_Wrap_alloc<std::allocator<Object_3D> > & _Al) Line 80 C++
s3d_app.exe!std::vector<Object_3D,std::allocator<Object_3D> >::_Destroy(Object_3D * _First, Object_3D * _Last) Line 1480 C++
s3d_app.exe!std::vector<Object_3D,std::allocator<Object_3D> >::_Reallocate(unsigned int _Count) Line 1515 C++
s3d_app.exe!std::vector<Object_3D,std::allocator<Object_3D> >::_Reserve(unsigned int _Count) Line 1532 C++
s3d_app.exe!std::vector<Object_3D,std::allocator<Object_3D> >::push_back(const Object_3D & _Val) Line 1199 C++
我尝试将球对象创建为指针并将其添加到指针数组中。我尝试将球创建为对象并将其作为指针添加到数组中。我尝试在for循环中创建球对象。
编辑:Object_3D代码
#include <graphics/mesh_instance.h>
#include <graphics/model.h>
#include <assets/png_loader.h>
#include <assets/obj_loader.h>
#include <maths/vector3.h>
class Object_3D{
public:
Object_3D();
~Object_3D();
void Init(abfw::Platform& platform, const char*);
void SetTranslation(abfw::Vector3 transform_);
void SetScale(abfw::Vector3 scale_);
void Move(abfw::Vector3 move_);
abfw::Model& GetModel();
abfw::MeshInstance GetMeshInstance();
abfw::Matrix44 GetTransform();
abfw::Vector3 position_;
private:
abfw::Model model_;
abfw::MeshInstance mesh_instance_;
abfw::Matrix44 transform_;
};
CPP。
#include "Object_3D.h"
Object_3D::Object_3D(){
}
Object_3D::~Object_3D(){
model_.Release();
}
void Object_3D::Init(abfw::Platform& platform_, const char *filename){
abfw::OBJLoader obj_loader;
obj_loader.Load(filename, platform_, model_);
mesh_instance_.set_mesh(model_.mesh());
transform_.SetIdentity();
mesh_instance_.set_transform(transform_);
position_ = transform_.GetTranslation();
}
abfw::Model& Object_3D::GetModel(){
return model_;
}
abfw::MeshInstance Object_3D::GetMeshInstance(){
return mesh_instance_;
}
void Object_3D::SetTranslation(abfw::Vector3 position_vector_){
position_ = position_vector_;
transform_.SetTranslation(position_);
mesh_instance_.set_transform(transform_);
}
void Object_3D::Move(abfw::Vector3 move_){
position_ += move_;
transform_.SetTranslation(position_);
mesh_instance_.set_transform(transform_);
}
void Object_3D::SetScale(abfw::Vector3 scalingVector){
transform_.Scale(scalingVector);
mesh_instance_.set_transform(transform_);
}
abfw::Matrix44 Object_3D::GetTransform(){
return transform_;
}
答案 0 :(得分:2)
什么是错误的
您的成员没有值初始化。当构造函数(无论是copy-ctor,default-ctor,special-ctor,无论如何)完成时。 所有成员变量应该在某种意义上初始化。
你公然违反了Rule of Three。您需要遵守它,因为您有一个资源自由的析构函数,因此需要资源复制(或至少资源共享)复制构造函数和赋值运算符。
您的代码崩溃的原因
您的Object_3D
类拥有动态资源(该模型就是这样一种资源)。将新初始化的对象推入向量时,会生成对象的浅副本,因为您不提供自定义复制/赋值语义。结果,调用为类提供的隐式copy-ctor。这意味着一旦推送完成,您现在拥有两个对象,这些对象包含对相同数据的动态资源引用。当循环体循环时,循环中的本地对象被销毁,析构函数将释放这些资源,并且向量中的副本将保留无效的资源引用。稍后访问这些引用会触发您的崩溃。
如何修复
使用Rule of Three方法实施您的对象,或使用唯一对象实施单一所有权共享资源意识形态。后者可以使用智能指针和所述相同的向量来完成。我不熟悉您正在使用的工具包,因此提供硬编码解决方案是不可能的,但是可以说您的对象必须完全拥有他们的资源(因此适当)复制/赋值语义必须编码),或者必须开发共享机制以允许多个对象共享对相同资源的引用,并且门外的最后一个人关闭灯。
如何实现,我留给你,但至少你知道你的问题。