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:
parent
4dcde604b1
commit
894cd8a604
@ -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
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user