Утечка памяти в классе Mex — нужен ли деструктор для карт STL?

Я ищу утечку памяти в каком-то mex-коде (ИТ-служба поддержки, где я работаю, не установила полезные отладочные флаги, что делает Valgrind практически бесполезным …).

Один из потенциальных источников, которые я нашел, — это мой домашний класс по Матрице. Он использует карту карт STL (т.е. map<int, map<int, double> > хранить матрицу. Я предполагал, что благодаря моему использованию STL C ++ может автоматически обрабатывать сборку мусора в конце выполнения программы, но теперь мне интересно, нужно ли мне жестко кодировать деструктор, чтобы сначала очистить внутренние карты тогда внешний?

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

Для ясности, соответствующие части определения класса Matrix:

class Matrix
{
public:
std::map< int, std::map<int, double> > elems;
int rows;
int cols;

Matrix( );
Matrix( int numRows, int numCols );

// ... Getters, setters, operations and other miscellanea
}

(Я понимаю, что объявление моих экземпляров как публичных — это неаккуратная ОО-практика, но это хакерский код для вас!).

Если это не деструктор, мне интересно, если это где-то в следующем коде:

    Matrix D;
distance_cost( &D, &traj1, &traj2 ); // Init Matrix and flesh out data
plhs[1] = mxCreateDoubleMatrix( D.rows, D.cols, mxREAL ); // Prepare output
D_output = mxGetPr( plhs[1] );
D.toDouble( D_output ); // Convert Matrix data maps to double* for Matlab

где distance_cost определяется так:

void distance_cost( Matrix *Q, Trajectory *A, Trajectory *B) {

int M = A->length( );
int N = B->length( );

(*Q) = Matrix( M, N );

for( int m=0; m < M; m++ ) {
for( int n=0; n < N; n++ ) {
float dist = A->at(m).dist2D( B->at(n) );
Q->set(m,n,dist);
}
}

}

а также toDouble() является:

void Matrix::toDouble( double *dbl ) const {
for( int i=0; i < this->rows; i++ ) {
for( int j=0; j < this->cols; j++ ) {
dbl[i+j*this->rows] = this->at(i,j);
}
}
}

Приветствуется любая помощь, совет или критика по поводу моего неаккуратного использования управления памятью — я взломал себя в довольно трясину и не могу понять, как из него выбраться!

2

Решение

Если это все переменные-члены в Matrixтогда вы, скорее всего, в порядке.

  • std::map< int, std::map<int, double> > elems;
  • int rows;
  • int cols;

Всегда возможно, что какая-то функция вызывает утечку памяти. Но из того, что вы показали нам, вы не потеряете память.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]