J'ai un code qui est destiné à gérer la mémoire, mais il continue de se bloquer à un certain point où je retire un objet de la liste 'live' et le place sur le 'mort' un:L'utilisation consécutive de std :: list provoque un plantage
class MemoryObject {
private:
static std::list <MemoryObject *> alive, dead;
long references;
public:
MemoryObject() {
alive.push_back(this);
references = 0;
}
static void deepClean() {
clean();
std::list<MemoryObject *>::iterator iterator;
for(iterator = alive.begin(); iterator != alive.end(); iterator ++) {
MemoryObject *object = *iterator;
Log::instance().write(DEBUG_LOG, "\nObject still active at the end of the program, check for memory leaks."
"\nSize: %d",
alive.size());
delete object;
}
alive.clear();
}
void reference() {
references ++;
}
void release() {
references --;
if(references <= 0) {
dead.push_back(this);
alive.remove(this);
}
}
static void clean() {
std::list<MemoryObject *>::iterator iterator;
for(iterator = dead.begin(); iterator != dead.end(); iterator ++)
delete(&iterator);
dead.clear();
}
~MemoryObject() {
clean();
}
};
std::list <MemoryObject *> MemoryObject::alive, MemoryObject::dead;
Eclipse debug montre qu'il ne en liberté(), toujours à la deuxième place liées aux listes - J'ai essayé de les mettre (alive.remove(this) and dead.push_back(this)
) dans un ordre différent, qui ne change rien. Il est intéressant cependant, si je place quelque chose entre eux, comme un printf(), mais il ne tombe pas en panne ...
Voilà où je l'appeler de:
#include <stdlib.h>
#include <stdio.h>
#include "log/log.hpp"
#include "memory/object.hpp"
int main(int argc, char *argv[]) {
MemoryObject foo;
foo.release();
MemoryObject::deepClean();
return 0;
}
Dans votre fonction '' non polluants vous supprimez (et iterator) '. C'est à peine correct. –
Veuillez montrer comment vous appelez les fonctions. –
S'il vous plaît lire ceci: [mcve] –