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