Я ищу утечку памяти в каком-то 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);
}
}
}
Приветствуется любая помощь, совет или критика по поводу моего неаккуратного использования управления памятью — я взломал себя в довольно трясину и не могу понять, как из него выбраться!
Если это все переменные-члены в Matrix
тогда вы, скорее всего, в порядке.
std::map< int, std::map<int, double> > elems;
int rows;
int cols;
Всегда возможно, что какая-то функция вызывает утечку памяти. Но из того, что вы показали нам, вы не потеряете память.
Других решений пока нет …