功能导致巨大的内存泄漏?

时间:2010-07-31 20:21:28

标签: c++ c algorithm memory function

我有以下功能:

void CGlEngineFunctions::GetBezierOpposite( const POINTFLOAT &a,const POINTFLOAT &center, 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 &center, 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;

2 个答案:

答案 0 :(得分:1)

如果GetDistance调用此方法,则可能存在 Stack Overflow

如果其他线程调用此方法,则可能存在 Stack Overflow

检查POINTFLOAT定义。恕我直言,应修改它以提供减法运算。您不应该引用任何结构的成员。但是这个评论将是关于C ++的。

您应该删除'C'语言标记,因为C语言不提供范围解析运算符'::'。

答案 1 :(得分:0)

如果POINTFLOAT是一些复杂的class(你已经标记了你的问题C ++)并且你在表达式中重载了运算符,我们怎么知道呢?

你也没有告诉我们为什么你认为这些表达是罪魁祸首,无论你的编译器,平台,操作系统......

找到所有这些的最简单方法是valgrind(对于unixen)或类似的工具。他们会告诉您确切的分配地点,最终被泄露。