Функция вызывает огромную утечку памяти? - PullRequest
0 голосов
/ 01 августа 2010

У меня есть следующая функция:

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;

}

Я сузил задачу до двух строк:

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 ]

1 голос
/ 01 августа 2010

Если GetDistance вызывает этот метод, возможно, переполнение стека .

Если другие потоки вызывают этот метод, возможно, переполнение стека .

Проверьте определение POINTFLOAT. ИМХО, его следует модифицировать, чтобы обеспечить операции вычитания. Вам не нужно ссылаться на кого-либо из членов структуры. Но тогда этот комментарий будет о C ++.

Вы должны удалить языковой тег 'C', поскольку язык C не предоставляет оператора разрешения области видимости '::'.

0 голосов
/ 01 августа 2010

Если POINTFLOAT является чем-то сложным class (вы пометили свой вопрос C ++), и вы перегружали операторы в выражении, как мы можем узнать?

Кроме того, вы не сказали нам много, почему вы думаете, что эти выражения являются виновником, ни о вашем компиляторе, платформе, ОС ...

Самый простой способ выяснить это - valgrind (для unixen) или какой-либо подобный инструмент. Они точно скажут вам, где происходит распределение, которое заканчивается утечкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...