fixed memory-leak:

allocated RaceGUI::TimedMessage's were not deleted, only erased from the vector

RaceGUI::cleanupMessages(): fixed iterator usage for std::vector.erase - the returned iterator must be used, the passed iterator becomes invalid after erase, so one has to use the returned one

changed vector-type RaceGUI::AllMessageType to vector of objects, rather than vector of pointers .. no risk of memory-leaks here anymore ..

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/trunk/supertuxkart@1237 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
ikework 2007-09-10 14:11:08 +00:00
parent 4dcde604b1
commit 894cd8a604
2 changed files with 30 additions and 20 deletions

View File

@ -813,10 +813,14 @@ void RaceGUI::cleanupMessages()
AllMessageType::iterator p =m_messages.begin();
while(p!=m_messages.end())
{
if((*p)->done())
m_messages.erase(p);
if((*p).done())
{
p = m_messages.erase(p);
}
else
p++;
{
++p;
}
}
} // cleanupMessages
@ -834,20 +838,21 @@ void RaceGUI::drawAllMessages(Kart* player_kart, int offset_x, int offset_y,
// The message are displayed in reverse order, so that a multi-line
// message (addMessage("1", ...); addMessage("2",...) is displayed
// in the right order: "1" on top of "2"
for(std::vector<TimedMessage*>::iterator i=m_messages.begin();
i!=m_messages.end(); i++)
for(AllMessageType::const_iterator i=m_messages.begin();i!=m_messages.end(); ++i)
{
// Display only messages for all karts, or messages for this kart
if( (*i)->m_kart && (*i)->m_kart!=player_kart) continue;
TimedMessage const &msg = *i;
font_race->Print( (*i)->m_message, (*i)->m_font_size,
// Display only messages for all karts, or messages for this kart
if( msg.m_kart && msg.m_kart!=player_kart) continue;
font_race->Print( msg.m_message.c_str(), msg.m_font_size,
Font::ALIGN_CENTER, Font::CENTER_OF_SCREEN,
Font::ALIGN_BOTTOM, y,
(*i)->m_red, (*i)->m_green, (*i)->m_blue,
msg.m_red, msg.m_green, msg.m_blue,
ratio_x, ratio_y,
offset_x, offset_x+(int)(user_config->m_width*ratio_x));
// Add 20% of font size as space between the lines
y-=(*i)->m_font_size*12/10;
y-=msg.m_font_size*12/10;
} // for i in all messages
@ -861,9 +866,7 @@ void RaceGUI::drawAllMessages(Kart* player_kart, int offset_x, int offset_y,
void RaceGUI::addMessage(const char *msg, Kart *kart, float time,
int font_size, int red, int green, int blue)
{
TimedMessage *m=new TimedMessage(msg, kart, time, font_size,
red, green, blue);
m_messages.push_back(m);
m_messages.push_back(TimedMessage(msg, kart, time, font_size, red, green, blue));
} // addMessage
//-----------------------------------------------------------------------------

View File

@ -21,6 +21,9 @@
#ifndef HEADER_RACEGUI_H
#define HEADER_RACEGUI_H
#include <string>
#include <vector>
#include "base_gui.hpp"
#include "kart.hpp"
#include "material.hpp"
@ -51,11 +54,14 @@ class RaceGUI: public BaseGUI
class TimedMessage
{
public:
const char *m_message; // message to display
float m_end_time; // end time for the message (-1 if once only)
int m_red,m_blue,m_green; // colour
int m_font_size; // size
Kart *m_kart;
std::string m_message; // message to display
float m_end_time; // end time for the message (-1 if once only)
int m_red,m_blue,m_green; // colour
int m_font_size; // size
Kart *m_kart;
// std::vector needs standard copy-ctor and std-assignment op.
// let compiler create defaults .. they'll do the job, no
// deep copies here ..
TimedMessage(const char *message,
Kart *kart, float time, int size,
int red, int green, int blue)
@ -66,9 +72,10 @@ class RaceGUI: public BaseGUI
m_end_time = time>=0.0f ? world->m_clock+time : -1.0f;
m_red=red; m_blue=blue; m_green=green;
}
bool done() {return m_end_time<0 || world->m_clock>m_end_time;}
bool done() const {return m_end_time<0 || world->m_clock>m_end_time;}
};
public:
RaceGUI();
~RaceGUI();
void update(float dt);
@ -87,7 +94,7 @@ private:
Material* m_steering_wheel_icon;
Material* m_speed_back_icon;
Material* m_speed_fore_icon;
typedef std::vector<TimedMessage*> AllMessageType;
typedef std::vector<TimedMessage> AllMessageType;
AllMessageType m_messages;
/* Display informat on screen */