J'essaie de trouver une fuite de mémoire avec le détecteur visuel de fuite. Il me montre m_neighbors.push_back(ent);
provoque une fuite.push_backing dans la liste des pointeurs provoque une fuite de mémoire
(brève callstack = NeighborCalculatorDummy -> foreach -> Liste -> allouer)
Je l'utilise comme NeighborCalculatorDummy<Entity *>
, donc il suffit d'insérer repoussage doit pointer dans la liste sans aucune allocation. Tous les pointeurs vers des entités qui proviennent d'addEntity sont supprimés ailleurs dans le code ...
Comment est-il possible que push_back
provoque une fuite?
template <typename entity_type>
class NeighborCalculatorDummy
{
public:
inline void addEntity(const entity_type & entity)
{
m_entities.push_back(entity);
}
void calculateNeighbors(const vector_type & position, flt32 radius)
{
flt32 rSq = radius*radius;
m_neighbors.clear();
std::for_each(m_entities.begin(), m_entities.end(), [&](entity_type ent){
if(lengthSq(ent->getPosition() - position) <= rSq)
m_neighbors.push_back(ent);
});
}
private:
std::vector<entity_type> m_entities;
std::list<entity_type> m_neighbors;
};
modifier
ici est le code autour NeighborCalculator
//#1
std::list<Vehicle *> vehicles;
vehicles.push_back(new Vehicle);
vehicles.push_back(new Vehicle);
vehicles.push_back(new Vehicle);
//#2
NeighborCalculatorDummy<Vehicle *> neighborCalculator = new NeighborCalculatorDummy<Vehicle *>();
std::for_each(vehicles.begin(), vehicles.end(), [&](Vehicle * vehicle){
neighborCalculator->addEntity(vehicle);
});
//#3 impl of addEntity
template <typename entity_type>
void NeighborCalculatorDummy<entity_type>::addEntity(const entity_type & entity)
{
...
m_entities.push_back(entity); //m_entities is - std::vector<Vehicle *>
}
//#4 end of program
delete neighborCalculator;
std::for_each(vehicles.begin(), vehicles.end(), [&](Vehicle * vehicle){
delete vehicle;
});
Où supprimez-vous le pointeur avec de la mémoire allouée dynamiquement? Où l'avez-vous alloué? –
Vous avez probablement besoin d'ajouter plus d'informations, comme quel est le type de 'entity_type', et comment le' NeighborCalculatorDummy' est utilisé (est-il détruit?) Si la mémoire qui a fui a été acquise dans l'appel 'push_back', semble indiquer que la liste n'est pas détruite correctement. –
Le détecteur de fuite de mémoire CRT indique-t-il la même fuite? –