carm: memory leak fix when multiple preset extensions exist for same factory pointer.

git-svn-id: https://projectm.svn.sourceforge.net/svnroot/projectm/personal/carm/represet@1204 6778bc44-b910-0410-a7a0-be141de4315d
This commit is contained in:
psperl
2009-01-22 04:15:24 +00:00
parent 574c81c542
commit 91639a6ff5
4 changed files with 28 additions and 8 deletions

View File

@ -29,9 +29,14 @@ MilkdropPresetFactory::MilkdropPresetFactory(int gx, int gy) {
MilkdropPresetFactory::~MilkdropPresetFactory() {
std::cerr << "[~MilkdropPresetFactory] destroy infix ops" << std::endl;
Eval::destroy_infix_ops();
std::cerr << "[~MilkdropPresetFactory] destroy builtin func" << std::endl;
BuiltinFuncs::destroy_builtin_func_db();
std::cerr << "[~MilkdropPresetFactory] delete preset out puts" << std::endl;
delete(_presetOutputs);
std::cerr << "[~MilkdropPresetFactory] done" << std::endl;
}
/* Reinitializes the engine variables to a default (conservative and sane) value */

View File

@ -55,12 +55,14 @@ NativePresetFactory::NativePresetFactory() {}
NativePresetFactory::~NativePresetFactory() {
for (PresetLibraryMap::iterator pos = _libraries.begin(); pos != _libraries.end(); ++pos)
for (PresetLibraryMap::iterator pos = _libraries.begin(); pos != _libraries.end(); ++pos) {
std::cerr << "deleting preset library" << std::endl;
delete(pos->second);
}
}
PresetLibrary * NativePresetFactory::loadLibrary(const std::string & url) {
if (_libraries.count(url))
@ -91,6 +93,8 @@ PresetLibrary * NativePresetFactory::loadLibrary(const std::string & url) {
return 0;
}
std::cerr << "[NativePresetFactory] creating preset library from url " << url << std::endl;
PresetLibrary * library = new PresetLibrary(handle, create, destroy);
_libraries.insert(std::make_pair(url, library));

View File

@ -24,8 +24,12 @@ PresetFactoryManager::PresetFactoryManager() : _gx(0), _gy(0) {}
PresetFactoryManager::~PresetFactoryManager() {
for (std::vector<PresetFactory *>::iterator pos = _factoryList.begin();
pos != _factoryList.end(); ++pos)
pos != _factoryList.end(); ++pos) {
std::cerr << "fuck" << std::endl;
assert(*pos);
delete(*pos);
}
}
void PresetFactoryManager::initialize(int gx, int gy) {
@ -51,13 +55,14 @@ void PresetFactoryManager::registerFactory(const std::string & extensions, Prese
std::stringstream ss(extensions);
std::string extension;
_factoryList.push_back(factory);
while (ss >> extension) {
if (_factoryMap.count(extension)) {
std::cerr << "[PresetFactoryManager] Warning: extension \"" << extension <<
"\" already has a factory. New factory handler ignored." << std::endl;
} else {
_factoryMap.insert(std::make_pair(extension, factory));
_factoryList.push_back(factory);
_factoryMap.insert(std::make_pair(extension, factory));
}
}
}

View File

@ -89,6 +89,13 @@ int main(int argc, char **argv) {
float fakePCM[512];
void cleanup() {
delete(globalPM);
exit(0);
}
void renderLoop() {
while (1) {
projectMEvent evt;
@ -107,8 +114,7 @@ void renderLoop() {
case PROJECTM_KEYDOWN:
switch (key) {
case PROJECTM_K_ESCAPE:
delete(globalPM);
exit(0);
cleanup();
break;
case PROJECTM_K_f: {
fullscreen = !fullscreen;
@ -122,7 +128,7 @@ void renderLoop() {
break;
}
case PROJECTM_K_q:
exit(1);
cleanup();
break;
default:
globalPM->key_handler(evt, key, mod);