Я думаю, у меня есть утечка памяти.Что теперь? - PullRequest
1 голос
/ 27 сентября 2011

Я создал функцию C ++ DLL, которая использует несколько массивов для обработки данных изображений. Я пытаюсь передать эти массивы по ссылке, выполнить вычисления и передать результат обратно по ссылке в предварительно выделенном массиве. В этой функции я использую Intel Performance Primitives, включая ippsMalloc и ippsFree:

Process.dll

int __stdcall ProcessImage(const float *Ref, const float *Source, float *Dest, const float *x, const float *xi, const int row, const int col, const int DFTlen, const int IMGlen)
{
int k, l;
IppStatus status;
IppsDFTSpec_R_32f *spec;
Ipp32f *y = ippsMalloc_32f(row),
    *yi = ippsMalloc_32f(DFTlen),
    *X = ippsMalloc_32f(DFTlen),
    *R = ippsMalloc_32f(DFTlen);

for (int i = 0; i < col; i++)
{
    for (int j = 0; j < row; j++)
        y[j] = Source[j + (row * i)];
    status = ippsSub_32f_I(Ref, y, row);

            // Some interpolation calculations calculations here

    status = ippsDFTInitAlloc_R_32f(&spec, DFTlen, IPP_FFT_DIV_INV_BY_N, ippAlgHintNone);
    status = ippsDFTFwd_RToCCS_32f(yi, X, spec, NULL);
    status = ippsMagnitude_32fc( (Ipp32fc*)X, R, DFTlen);

    for (int m = 0; m < IMGlen; m++)
        Dest[m + (IMGlen * i)] = 10 * log10(R[m]);
}
_CrtDumpMemoryLeaks();

ippsDFTFree_R_32f(spec);
ippsFree(y);
ippsFree(yi);
ippsFree(X);
ippsFree(R);
return(status);
}

Вызов функции выглядит так:

for (int i = 0; i < Frames; i++)
    ProcessFrame(&ref[i * FrameSize], &source[i * FrameSize], &dest[i * FrameSize], mX, mXi, NumPixels, Alines, DFTLength, IMGLength);

Функция не дает сбоя и выдает желаемый результат для до 6 изображений, более того, и умирает с:

First-chance exception at 0x022930e0 in DLL_test.exe: 0xC0000005: Access violation reading location 0x1cdda000.

Я попытался отладить программу, к сожалению, VS сообщает, что расположение стека вызовов находится в IPP DLL с «Нет доступных источников». Постоянно происходит сбой при вызове ippMagnitude32fc( (Ipp32fc*)X, R, DFTlen)

Что приводит меня к моим вопросам: это утечка памяти? Если так, кто-нибудь может увидеть, где находится утечка? Если нет, может кто-нибудь подсказать, как отладить эту проблему?

1 Ответ

2 голосов
/ 27 сентября 2011

Чтобы ответить на ваш первый вопрос, нет, это не утечка памяти, это повреждение памяти.Утечка памяти - это когда вы не освобождаете используемую память, и, следовательно, использование памяти растет.Это не приводит к тому, что программа не работает, а только в итоге использует слишком много памяти, что приводит к тому, что компьютер работает очень медленно (подкачка) и в конечном итоге происходит сбой любой программы с ошибкой «недостаточно памяти».То, что у вас есть, это базовая ошибка указателя, так как она все время происходит в C ++.Объяснить, как отлаживать сложно, я предлагаю вам добавить точку останова непосредственно перед сбоем и попытаться выяснить, в чем дело.

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