Michael Chisholm
-
2014-02-10
- status: open --> closed-fixed
The Following function in absobjectcollector.cpp causes a memory leak.
CollectedObject* AbsObjectCollector::ProcessObject(Object* object) { CollectedObject* collectedObject = NULL; // Handle objects that are not applicable if(this->IsApplicable(object) == false) { collectedObject = CollectedObject::CreateNotApplicable(object); collectedObject->SetVariableValues(object->GetVariableValues()); } else { // handle objects that are not supported if(this->IsSupported(object) == false) { collectedObject = CollectedObject::CreateNotSupported(object); collectedObject->SetVariableValues(object->GetVariableValues()); } else { ItemVector* items = NULL; AbsProbe* probe = this->GetProbe(object); if(probe != NULL) { items = probe->Run(object); // MEMORY LEAK // only create collected object if the probe succeeds collectedObject = CollectedObject::Create(object); collectedObject->AppendVariableValues(object->GetVariableValues()); // MEMORY LEAK collectedObject->AppendReferencesAndComputeFlag(items); } else { // because we first check if the object is supported the code should never get here. throw AbsObjectCollectorException("Error: Unable to locate a probe for the specified object.", ERROR_FATAL); } } } return collectedObject; }
The Following function can be used to resolve the leak.
CollectedObject* AbsObjectCollector::ProcessObject(Object* object) { VariableValueVector* varValues; CollectedObject* collectedObject = NULL; // Handle objects that are not applicable if(this->IsApplicable(object) == false) { collectedObject = CollectedObject::CreateNotApplicable(object); collectedObject->SetVariableValues(object->GetVariableValues()); } else { // handle objects that are not supported if(this->IsSupported(object) == false) { collectedObject = CollectedObject::CreateNotSupported(object); collectedObject->SetVariableValues(object->GetVariableValues()); } else { ItemVector* items = NULL; AbsProbe* probe = this->GetProbe(object); if(probe != NULL) { items = probe->Run(object); // only create collected object if the probe succeeds collectedObject = CollectedObject::Create(object); // MEMORY LEAK RESOLVED varValues = object->GetVariableValues(); collectedObject->AppendVariableValues(varValues); delete varValues; collectedObject->AppendReferencesAndComputeFlag(items); delete items; // MEMORY LEAK RESOLVED } else { // because we first check if the object is supported the code should never get here. throw AbsObjectCollectorException("Error: Unable to locate a probe for the specified object.", ERROR_FATAL); } } } return collectedObject; }