Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Visual C++ и MatLab, проблемы с mxDestroyArray


Автор: gromo 4.10.2009, 12:23
Всем привет!
Проблема заключается в следующем, для очистки выделенной памяти вызываю функцию mxDestroyArray, но почему-то она не срабатывает.
Как следствие возникает "утечка" памяти, со всеми вытекающими.
Подскажите, пожалуйста, что делать?

Автор: smoke_man 4.10.2009, 12:28
Пример кода в студию.

Автор: gromo 4.10.2009, 12:35
Код

 mxArray *IzotopCount    = NULL;
  mxArray *CircleCount    = NULL;  
  mxArray *Path            = NULL;
  mxArray *InPutData1    = NULL;
  mxArray *InPutData2    = NULL;
  mxArray *OutPutData    = NULL;

  int arrays[ 2 ] = {Property.m_nIzotopCount, 3};
  //Создаем строку
  Path = mxCreateString(szDir);
  InPutData1 = mxCreateString("ResultEasingWeight.txt");
  InPutData2 = mxCreateString("ResultDetector.txt");
  OutPutData = mxCreateString("ResultAfterML.txt");
  //Создаем матрицу 1 на 4
  IzotopCount = mxCreateDoubleMatrix(1,1,mxREAL);
  CircleCount = mxCreateDoubleMatrix(1,1,mxREAL);

  //Копируем данные
  memcpy( mxGetPr(IzotopCount), &arrays[0], 1 * sizeof(double) );
  memcpy( mxGetPr(CircleCount), &arrays[1], 1 * sizeof(double) );
  
  MatLabCalclibInitialize();                                                            //Инициализируем библиотеку
  mlfMatlabcalc( IzotopCount, CircleCount, Path, InPutData1, InPutData2, OutPutData );    //Вызываем функцию
  MatLabCalclibTerminate();                                                                //Зевершаем работу библиотеки
  
  // освобождаем память.
  mxDestroyArray(IzotopCount);
  mxDestroyArray(CircleCount);
  mxDestroyArray(Path);
  mxDestroyArray(InPutData1);
  mxDestroyArray(InPutData2);
  mxDestroyArray(OutPutData);

  return EXIT_SUCCESS;

Автор: smoke_man 4.10.2009, 12:51
Написано все правильно - и память под mxArray должна освобождаться. Вот описание из документации:
Цитата

mxDestroyArray (C and Fortran) - 
Free dynamic memory allocated by mxCreate* functions
C Syntax
#include "matrix.h"
void mxDestroyArray(mxArray *pm);
Fortran Syntax
mxDestroyArray(pm)
mwPointer pm
Arguments
pm

Pointer to the mxArray you want to free
Description

mxDestroyArray deallocates the memory occupied by the specified mxArray. mxDestroyArray not only deallocates the memory occupied by the mxArray's characteristics fields (such as m and n), but also deallocates all the mxArray's associated data arrays, such as pr and pi for complex arrays, ir and jc for sparse arrays, fields of structure arrays, and cells of cell arrays. Do not call mxDestroyArray on an mxArray you are returning on the left-hand side.


Добавлено через 4 минуты и 20 секунд
Версия MatLab 6.5?

Автор: gromo 4.10.2009, 12:58
а может эта функция работает только в Engine?

Добавлено через 5 минут и 47 секунд
smoke_man, смотри:
Значение переменной IzotopCount до освобождения памяти = 0x012ecc98
Значение переменной IzotopCount после освобождения памяти = 0x012ecc98

Добавлено через 6 минут и 47 секунд
с остальными переменными такая же беда

Добавлено через 8 минут и 7 секунд
MatLab 6.5

Автор: smoke_man 4.10.2009, 13:22
во посмотри пример в отладчике
Код

int main()
{
    int *test;
    test = new int[20];
    delete [] test;
    return 0;
}

Автор: gromo 4.10.2009, 13:28
аналогичная ситуация:
остаётся 0x008a2950

P.S.Давай спишемся в "аське"?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)