2013-05-18 4 views
3

J'ai une matrice uBLAS, comme ceci:matrice uBLAS mémoire claire

boost::numeric::ublas::matrix<double> mat(50000,50000); 

Une fois que je suis fait avec un ensemble de calculs sur la matrice, je veux sa mémoire libérée.

J'ai utilisé mat.clear() qui, selon le docs, "efface la matrice". Mais mon programme continue de manquer de mémoire.

Creuser dans les en-têtes, je trouve ceci:

void clear() { 
    std::fill (data().begin(), data().end(), value_type/*zero*/()); 
} 

Donc, il y a un problème sémantique clair avec clear().

La question est alors, comment puis-je m'assurer que la mémoire est libérée?

+0

Est-ce que vous arrive d'avoir trouvé une solution au problème? – k1next

+0

Avez-vous trouvé une solution à ce problème? Il semble que je rencontre le même problème. Une façon élégante de traiter le problème serait de redimensionner la matrice à (0,0). Je me demandais s'il y avait une «bonne» façon de le faire. – Devil

+0

@Devil, mais le redimensionnement est-il garanti pour libérer de la mémoire? Par exemple, avec 'std :: vector', un redimensionnement ne constitue pas une telle garantie puisque le vecteur peut être agrandi plus tard et que les allocations sont chères. Au lieu de cela, la fonction C++ 11 'shrink_to_fit()' doit être utilisée. Je n'ai jamais trouvé de solution adéquate à ce problème et j'ai fini par utiliser un vecteur std :: de std :: vectors puisque je voulais surtout uBLAS comme une matrice 2D pratique. – Richard

Répondre

0

Une façon inélégante de retourner la mémoire est en redimensionnant la matrice:

mat.resize(0,0,false); 

Bien que je ne l'ai pas essayé d'utiliser zéro pour une valeur de taille moi-même ...

Questions connexes