我有以下功能:
void CGlEngineFunctions::GetBezierOpposite( const POINTFLOAT &a,const POINTFLOAT ¢er, POINTFLOAT &b, float blength )
{
POINTFLOAT v;
v.x = a.x - center.x;
v.y = a.y - center.y;
float alength = GetDistance(a,center);
if(blength == 0)
{
blength = alength;
}
float multiplier = blength / alength;
b.x = center.x - multiplier * v.x;
b.y = center.y - multiplier * v.y;
}
我已将问题缩小到至少2行:
b.x = center.x - multiplier * v.x;
b.y = center.y - multiplier * v.y;
每当我反复打电话时,记忆就会一直在崩溃。
我这样用:
glEngine.functions.GetBezierOpposite(usrpt[0].LeftHandle,
usrpt[0].UserPoint,usrpt[0].RightHandle,0);
我真的不知道这怎么会导致任何问题。 为了测试,我将其更改为:
void CGlEngineFunctions::GetBezierOpposite( const POINTFLOAT &a,const POINTFLOAT ¢er, POINTFLOAT &b, float blength )
{
POINTFLOAT v;
v.x = a.x - center.x;
v.y = a.y - center.y;
float alength = GetDistance(a,center);
if(blength == 0)
{
blength = alength;
}
float multiplier = blength / alength;
b.x = 5;
b.y = 5;
}
当我这样做时,它绝对没有问题。我没有看到做算术会如何导致内存使用率上升。
由于
如果alength和blength = 0,可能会导致这个原因吗?POINTFLOAT:
float x;
float y;
答案 0 :(得分:1)
如果GetDistance
调用此方法,则可能存在 Stack Overflow 。
如果其他线程调用此方法,则可能存在 Stack Overflow 。
检查POINTFLOAT定义。恕我直言,应修改它以提供减法运算。您不应该引用任何结构的成员。但是这个评论将是关于C ++的。
您应该删除'C'语言标记,因为C语言不提供范围解析运算符'::'。
答案 1 :(得分:0)
如果POINTFLOAT
是一些复杂的class
(你已经标记了你的问题C ++)并且你在表达式中重载了运算符,我们怎么知道呢?
你也没有告诉我们为什么你认为这些表达是罪魁祸首,无论你的编译器,平台,操作系统......
找到所有这些的最简单方法是valgrind
(对于unixen)或类似的工具。他们会告诉您确切的分配地点,最终被泄露。