【问题标题】:Function is causing huge memory leak?函数导致巨大的内存泄漏?
【发布时间】:2010-07-31 20:21:27
【问题描述】:

我有以下功能:

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;

【问题讨论】:

  • 你能为我们定义POINTFLOAT吗?这是可以猜测的,但最好确定一下。
  • 我对您的语言的细节一无所知,但如果 alengthblength 为零,float multiplier = blength / alength; 将抛出某种除以零异常或产生无穷大。
  • 定义一个巨大的内存泄漏。通过函数每次损失多少?
  • 假设 POINTFLOAT 只是一个简单的结构(pod),这段代码没有内存泄漏。您正在其他地方泄漏(如果它甚至是真正的泄漏),这可能取决于此函数的结果。寻找执行 malloc/new 或库调用的东西,当你完成资源时,你必须释放它。

标签: c++ c algorithm memory function


【解决方案1】:

如果GetDistance调用了这个方法,可能会出现堆栈溢出

如果其他线程调用此方法,可能会出现堆栈溢出

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

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

【讨论】:

  • 其实我觉得这里的C标签还可以。这里不需要了解 C++——这个问题对 C 和 C++ 都适用。
【解决方案2】:

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

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

找出所有这些的最简单方法是valgrind(适用于 unixen)或一些类似的工具。他们会准确地告诉您分配发生的位置并最终泄露。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多