将 glm::vec3 常量引用分配给另一个 glm::vec3 时发生奇怪的崩溃

Weird crash at asigning a glm::vec3 constant reference to another glm::vec3

我有一个 ModelMatrix class,其中我有一个 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    

我没有收到任何错误信息。 是什么导致了这个错误?

这是因为您正在引用现在已释放的内存:

delete this->position;
*this->position = position;

我不知道你为什么要删除它,因为我认为 glm::vec3 析构函数实际上没有做任何重要的事情,所以你可以这样做:

*this->position = position;

这里更好的方法是根本不使用指针。 glm::vec3 是固定大小的类型,可能使用 12 或 16 个字节。我认为完全没有必要为此使用单独的动态分配。

因此,您当前将 class 成员声明为:

glm::vec3 *position;

只需将其更改为:

glm::vec3 position;

然后删除您当前与 class 成员的所有 new/delete 通话。然后 setter 方法变为:

void ModelMatrix::SetPosition(const glm::vec3 &position)
{
    this->position = position;
}