我有一个ModelMatrix类,其中我将glm :: vec3定义为
glm::vec3 *position = nullptr;
然后我得到了一个setter方法
void ModelMatrix::SetPosition(const glm::vec3 &position)
{
delete this->position;
*this->position = position;
}
在指定常量引用时发生问题。
它进入这个方法
template <typename T, precision P>
GLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator= (tvec3<T, P> const & v)
{
this->x = v.x;
this->y = v.y;
this->z = v.z;
return *this;
}
然后只是在方法的第一行崩溃。
这是来自调用堆栈的片段。
glm::detail::tvec3<float, (glm::precision)0>::operator= at type_vec3.inl:189 0x404f78
core3d::ModelMatrix::SetPosition() at ModelMatrix.cpp:58 0x405bc3
core3d::ModelMatrix::ModelMatrix() at ModelMatrix.cpp:7 0x40582b
我没有任何错误消息。 导致此错误的原因是什么?
答案 0 :(得分:2)
这里更好的方法是根本不使用指针。 glm::vec3
是固定大小的类型,可能使用12或16个字节。我认为绝对不需要为它使用单独的动态分配。
因此,您当前将您的类成员声明为:
glm::vec3 *position;
只需将其更改为:
glm::vec3 position;
然后移除您目前为该类成员发起的所有new
/ delete
来电。然后setter方法变为:
void ModelMatrix::SetPosition(const glm::vec3 &position)
{
this->position = position;
}
答案 1 :(得分:1)
这是因为你正在引用你现在已经解除分配的记忆:
delete this->position;
*this->position = position;
我不知道你为什么要删除它,因为我不认为glm :: vec3析构函数实际上做了什么重要的事情,所以你可以这样做:
*this->position = position;