[Scummvm-cvs-logs] SF.net SVN: scummvm:[53945] scummvm/trunk/engines/hugo

strangerke at users.sourceforge.net strangerke at users.sourceforge.net
Sat Oct 30 18:04:43 CEST 2010


Revision: 53945
          http://scummvm.svn.sourceforge.net/scummvm/?rev=53945&view=rev
Author:   strangerke
Date:     2010-10-30 16:04:43 +0000 (Sat, 30 Oct 2010)

Log Message:
-----------
HUGO: Free memory on exit

Modified Paths:
--------------
    scummvm/trunk/engines/hugo/hugo.cpp
    scummvm/trunk/engines/hugo/hugo.h
    scummvm/trunk/engines/hugo/object.cpp
    scummvm/trunk/engines/hugo/object.h

Modified: scummvm/trunk/engines/hugo/hugo.cpp
===================================================================
--- scummvm/trunk/engines/hugo/hugo.cpp	2010-10-30 13:16:40 UTC (rev 53944)
+++ scummvm/trunk/engines/hugo/hugo.cpp	2010-10-30 16:04:43 UTC (rev 53945)
@@ -84,30 +84,9 @@
 }
 
 HugoEngine::~HugoEngine() {
-	delete _object;
-	delete _sound;
-	delete _route;
-	delete _parser;
-	delete _inventory;
-	delete _mouse;
-	delete _screen;
-	delete _scheduler;
-	delete _file;
-
 	free(_palette);
 	free(_introX);
 	free(_introY);
-
-#if 0
-	freeTexts(_textData);
-	freeTexts(_stringtData);
-	freeTexts(_textEngine);
-	freeTexts(_textIntro);
-	freeTexts(_textMouse);
-	freeTexts(_textParser);
-	freeTexts(_textSchedule);
-	freeTexts(_textUtil);
-#endif
 	free(_textData);
 	free(_stringtData);
 	free(_screenNames);
@@ -118,23 +97,40 @@
 	free(_textSchedule);
 	free(_textUtil);
 
-	warning("Missing: free _arrayNouns");
-	warning("Missing: free _arrayVerbs");
+	for (int i = 0; _arrayNouns[i]; i++)
+		free(_arrayNouns[i]);
+	free(_arrayNouns);
 
+	for (int i = 0; _arrayVerbs[i]; i++)
+		free(_arrayVerbs[i]);
+	free(_arrayVerbs);
+
 	free(_arrayReqs);
 	free(_hotspots);
 	free(_invent);
 	free(_uses);
 	free(_catchallList);
 
-	warning("Missing: free _background_objects");
+	for (int i = 0; i < _backgroundObjectsSize; i++)
+		free(_backgroundObjects[i]);
+	free(_backgroundObjects);
 
 	free(_points);
 
-	warning("Missing: free _cmdList");
-	warning("Missing: free _screenActs");
-	warning("Missing: free _objects");
+	for (int i = 0; i < _cmdListSize; i++)
+		free(_cmdList[i]);
+	free(_cmdList);
 
+	for (int i = 0; i < _screenActsSize; i++)
+		free(_screenActs[i]);
+	free(_screenActs);
+
+	_object->freeObjectArr();
+
+	for (int i = 0; i < _actListArrSize; i++)
+		free(_actListArr[i]);
+	free(_actListArr);
+
 	free(_defltTunes);
 	free(_screenStates);
 
@@ -146,6 +142,16 @@
 
 	if (_arrayFont[2])
 		free(_arrayFont[2]);
+
+	delete _object;
+	delete _sound;
+	delete _route;
+	delete _parser;
+	delete _inventory;
+	delete _mouse;
+	delete _screen;
+	delete _scheduler;
+	delete _file;
 }
 
 GameType HugoEngine::getGameType() const {
@@ -389,10 +395,10 @@
 	_stringtData = loadTextsVariante(in, 0);
 
 	// Read arrayNouns
-	_arrayNouns = loadTextsArray(in);
+	_arrayNouns = loadTextsArray(in, &_arrayNounsSize);
 
 	// Read arrayVerbs
-	_arrayVerbs = loadTextsArray(in);
+	_arrayVerbs = loadTextsArray(in, &_arrayVerbsSize);
 
 	// Read screenNames
 	_screenNames = loadTextsVariante(in, &_numScreens);
@@ -546,8 +552,9 @@
 	for (int varnt = 0; varnt < _numVariant; varnt++) {
 		numElem = in.readUint16BE();
 		if (varnt == _gameVariant) {
-			_backgroundObjects = (background_t **)malloc(sizeof(background_t *) * numElem);
-			for (int i = 0; i < numElem; i++) {
+			_backgroundObjectsSize = numElem;
+			_backgroundObjects = (background_t **)malloc(sizeof(background_t *) * _backgroundObjectsSize);
+			for (int i = 0; i < _backgroundObjectsSize; i++) {
 				numSubElem = in.readUint16BE();
 				_backgroundObjects[i] = (background_t *)malloc(sizeof(background_t) * numSubElem);
 				for (int j = 0; j < numSubElem; j++) {
@@ -594,8 +601,9 @@
 	for (int varnt = 0; varnt < _numVariant; varnt++) {
 		numElem = in.readUint16BE();
 		if (varnt == _gameVariant) {
-			_cmdList = (cmd **)malloc(sizeof(cmd *) * numElem);
-			for (int i = 0; i < numElem; i++) {
+			_cmdListSize = numElem;
+			_cmdList = (cmd **)malloc(sizeof(cmd *) * _cmdListSize);
+			for (int i = 0; i < _cmdListSize; i++) {
 				numSubElem = in.readUint16BE();
 				_cmdList[i] = (cmd *)malloc(sizeof(cmd) * numSubElem);
 				for (int j = 0; j < numSubElem; j++) {
@@ -631,8 +639,9 @@
 	for (int varnt = 0; varnt < _numVariant; varnt++) {
 		numElem = in.readUint16BE();
 		if (varnt == _gameVariant) {
-			_screenActs = (uint16 **)malloc(sizeof(uint16 *) * numElem);
-			for (int i = 0; i < numElem; i++) {
+			_screenActsSize = numElem;
+			_screenActs = (uint16 **)malloc(sizeof(uint16 *) * _screenActsSize);
+			for (int i = 0; i < _screenActsSize; i++) {
 				numSubElem = in.readUint16BE();
 				if (numSubElem == 0) {
 					_screenActs[i] = 0;
@@ -651,7 +660,7 @@
 		}
 	}
 
-	_object->loadObject(in);
+	_object->loadObjectArr(in);
 //#define HERO 0
 	_hero = &_object->_objects[HERO];                        // This always points to hero
 	_screen_p = &(_object->_objects[HERO].screenIndex);      // Current screen is hero's
@@ -661,8 +670,9 @@
 	for (int varnt = 0; varnt < _numVariant; varnt++) {
 		numElem = in.readUint16BE();
 		if (varnt == _gameVariant) {
-			_actListArr = (act **)malloc(sizeof(act *) * numElem);
-			for (int i = 0; i < numElem; i++) {
+			_actListArrSize = numElem;
+			_actListArr = (act **)malloc(sizeof(act *) * _actListArrSize);
+			for (int i = 0; i < _actListArrSize; i++) {
 				numSubElem = in.readUint16BE();
 				_actListArr[i] = (act *) malloc(sizeof(act) * (numSubElem + 1));
 				for (int j = 0; j < numSubElem; j++) {
@@ -1377,16 +1387,16 @@
 	return resArray;
 }
 
-char ***HugoEngine::loadTextsArray(Common::File &in) {
+char ***HugoEngine::loadTextsArray(Common::File &in, uint16 *arraySize) {
 	char ***resArray = 0;
 
 	for (int varnt = 0; varnt < _numVariant; varnt++) {
-		int numNouns = in.readUint16BE();
+		*arraySize = in.readUint16BE();
 		if (varnt == _gameVariant) {
-			resArray = (char ** *)malloc(sizeof(char **) * (numNouns + 1));
-			resArray[numNouns] = 0;
+			resArray = (char ***)malloc(sizeof(char **) * (*arraySize + 1));
+			resArray[*arraySize] = 0;
 		}
-		for (int i = 0; i < numNouns; i++) {
+		for (int i = 0; i < *arraySize; i++) {
 			int numTexts = in.readUint16BE();
 			int entryLen = in.readUint16BE();
 			char *pos = (char *)malloc(entryLen);

Modified: scummvm/trunk/engines/hugo/hugo.h
===================================================================
--- scummvm/trunk/engines/hugo/hugo.h	2010-10-30 13:16:40 UTC (rev 53944)
+++ scummvm/trunk/engines/hugo/hugo.h	2010-10-30 16:04:43 UTC (rev 53945)
@@ -139,17 +139,23 @@
 	char  **_textSchedule;
 	char  **_textUtil;
 	char  ***_arrayNouns;
+	uint16 _arrayNounsSize;
 	char  ***_arrayVerbs;
+	uint16 _arrayVerbsSize;
 	uint16    **_arrayReqs;
 	hotspot_t *_hotspots;
 	int16     *_invent;
 	uses_t    *_uses;
 	background_t *_catchallList;
 	background_t **_backgroundObjects;
+	uint16    _backgroundObjectsSize;
 	point_t   *_points;
 	cmd       **_cmdList;
+	uint16    _cmdListSize;
 	uint16    **_screenActs;
+	uint16    _screenActsSize;
 	act       **_actListArr;
+	uint16    _actListArrSize;
 	int16     *_defltTunes;
 	uint16    _look;
 	uint16    _take;
@@ -287,7 +293,7 @@
 	int _maxscore;                      // Holds maximum score
 
 	char **loadTextsVariante(Common::File &in, uint16 *arraySize);
-	char ***loadTextsArray(Common::File &in);
+	char ***loadTextsArray(Common::File &in, uint16 *arraySize);
 	uint16 **loadLongArray(Common::File &in);
 	char **loadTexts(Common::File &in);
 	void freeTexts(char **ptr);

Modified: scummvm/trunk/engines/hugo/object.cpp
===================================================================
--- scummvm/trunk/engines/hugo/object.cpp	2010-10-30 13:16:40 UTC (rev 53944)
+++ scummvm/trunk/engines/hugo/object.cpp	2010-10-30 16:04:43 UTC (rev 53945)
@@ -317,13 +317,18 @@
 	return foundFl;
 }
 
-void ObjectHandler::loadObject(Common::File &in) {
+void ObjectHandler::freeObjectArr() {
+	free(_objects);
+}
+
+void ObjectHandler::loadObjectArr(Common::File &in) {
 	debugC(6, kDebugObject, "loadObject(&in)");
 
 // TODO: For Hugo3, if not in story mode, set _objects[2].state to 3
 	for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
 		uint16 numElem = in.readUint16BE();
 		if (varnt == _vm->_gameVariant) {
+			_objCount = numElem;
 			_objects = (object_t *)malloc(sizeof(object_t) * numElem);
 			for (int i = 0; i < numElem; i++) {
 				_objects[i].nounIndex = in.readUint16BE();

Modified: scummvm/trunk/engines/hugo/object.h
===================================================================
--- scummvm/trunk/engines/hugo/object.h	2010-10-30 13:16:40 UTC (rev 53944)
+++ scummvm/trunk/engines/hugo/object.h	2010-10-30 16:04:43 UTC (rev 53945)
@@ -55,9 +55,9 @@
 	bool findObjectSpace(object_t *obj, int16 *destx, int16 *desty);
 
 	int16 findObject(uint16 x, uint16 y);
-
 	void freeObjects();
-	void loadObject(Common::File &in);
+	void loadObjectArr(Common::File &in);
+	void freeObjectArr();
 	void lookObject(object_t *obj);
 	void restoreSeq(object_t *obj);
 	void saveSeq(object_t *obj);
@@ -86,6 +86,7 @@
 	}
 protected:
 	HugoEngine *_vm;
+	uint16     _objCount;
 };
 
 class ObjectHandler_v1d : public ObjectHandler {


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list