在将glm :: vec3常量引用指向另一个glm :: vec3时出现奇怪的崩溃

时间:2015-05-31 11:07:15

标签: c++ opengl glm-math

我有一个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    

我没有任何错误消息。 导致此错误的原因是什么?

2 个答案:

答案 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;