summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <bjorn@lindeijer.nl>2025-02-25 16:14:03 +0100
committerThorbjørn Lindeijer <bjorn@lindeijer.nl>2025-02-26 21:18:09 +0000
commit471bd7e5ba449d0a5c7267e960801426248cfaa9 (patch)
treed21909990a03b16746094935b550e676b008176d /src
parent593361ba81764dae93c02bd5bc4ee238db55aac1 (diff)
downloadmana-471bd7e5ba449d0a5c7267e960801426248cfaa9.tar.gz
mana-471bd7e5ba449d0a5c7267e960801426248cfaa9.tar.bz2
mana-471bd7e5ba449d0a5c7267e960801426248cfaa9.tar.xz
mana-471bd7e5ba449d0a5c7267e960801426248cfaa9.zip
Plugged various memory leaks
* ActorSpriteManager failed to delete its AutoCompleteLister instances. * CharCreateDialog was relying on ~Window to delete its child widgets, but it wasn't always adding all its widgets, so some failed to get deleted. Now it only creates the widgets it needs. * SkillDialog didn't delete its SkillModels. * PlayerList didn't delete its player Avatar instances. * Fixed deletion of the EffectManager. Leaks located using AddressSanitizer.
Diffstat (limited to 'src')
-rw-r--r--src/actorspritemanager.cpp8
-rw-r--r--src/actorspritemanager.h6
-rw-r--r--src/avatar.h2
-rw-r--r--src/game.cpp1
-rw-r--r--src/gui/charcreatedialog.cpp50
-rw-r--r--src/gui/charcreatedialog.h6
-rw-r--r--src/gui/skilldialog.cpp79
-rw-r--r--src/gui/skilldialog.h7
-rw-r--r--src/gui/socialwindow.cpp7
-rw-r--r--src/net/tmwa/chathandler.cpp2
-rw-r--r--src/resources/settingsmanager.cpp1
-rw-r--r--src/units.cpp3
12 files changed, 85 insertions, 87 deletions
diff --git a/src/actorspritemanager.cpp b/src/actorspritemanager.cpp
index f7da58ec..74705f80 100644
--- a/src/actorspritemanager.cpp
+++ b/src/actorspritemanager.cpp
@@ -65,8 +65,8 @@ class PlayerNPCNamesLister : public AutoCompleteLister
ActorSpriteManager::ActorSpriteManager()
{
- mPlayerNames = new PlayerNamesLister;
- mPlayerNPCNames = new PlayerNPCNamesLister;
+ mPlayerNames = std::make_unique<PlayerNamesLister>();
+ mPlayerNPCNames = std::make_unique<PlayerNPCNamesLister>();
listen(Event::ConfigChannel);
}
@@ -342,12 +342,12 @@ bool ActorSpriteManager::hasActorSprite(ActorSprite *someActor) const
AutoCompleteLister *ActorSpriteManager::getPlayerNameLister() const
{
- return mPlayerNames;
+ return mPlayerNames.get();
}
AutoCompleteLister *ActorSpriteManager::getPlayerNPCNameLister() const
{
- return mPlayerNPCNames;
+ return mPlayerNPCNames.get();
}
void ActorSpriteManager::updatePlayerNames()
diff --git a/src/actorspritemanager.h b/src/actorspritemanager.h
index 48ee86e0..5df50006 100644
--- a/src/actorspritemanager.h
+++ b/src/actorspritemanager.h
@@ -28,6 +28,8 @@
#include "gui/widgets/textfield.h"
+#include <memory>
+
class LocalPlayer;
class Map;
@@ -168,8 +170,8 @@ class ActorSpriteManager : public EventListener
friend class PlayerNamesLister;
friend class PlayerNPCNamesLister;
- AutoCompleteLister *mPlayerNames;
- AutoCompleteLister *mPlayerNPCNames;
+ std::unique_ptr<AutoCompleteLister> mPlayerNames;
+ std::unique_ptr<AutoCompleteLister> mPlayerNPCNames;
ActorSprites mActors;
ActorSprites mDeleteActors;
Map *mMap;
diff --git a/src/avatar.h b/src/avatar.h
index 2ee73381..7c8de4fa 100644
--- a/src/avatar.h
+++ b/src/avatar.h
@@ -26,7 +26,7 @@
class Avatar
{
public:
- Avatar(const std::string &name = std::string());
+ explicit Avatar(const std::string &name = {});
/**
* Returns the avatar's name.
diff --git a/src/game.cpp b/src/game.cpp
index ac63fd6c..0607bcc2 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -250,6 +250,7 @@ Game::~Game()
del_0(actorSpriteManager)
if (Client::getState() != STATE_CHANGE_MAP)
del_0(local_player)
+ del_0(effectManager)
del_0(channelManager)
del_0(commandHandler)
del_0(joystick)
diff --git a/src/gui/charcreatedialog.cpp b/src/gui/charcreatedialog.cpp
index fa1144b6..46ebd18b 100644
--- a/src/gui/charcreatedialog.cpp
+++ b/src/gui/charcreatedialog.cpp
@@ -70,18 +70,6 @@ CharCreateDialog::CharCreateDialog(CharSelectDialog *parent, int slot):
mNameField = new TextField(std::string());
mNameLabel = new Label(_("Name:"));
- mNextHairColorButton = new Button("", "nextcolor", this);
- mPrevHairColorButton = new Button("", "prevcolor", this);
- mPrevHairColorButton->setButtonIcon("tab_arrows_left.png");
- mNextHairColorButton->setButtonIcon("tab_arrows_right.png");
-
- mHairColorLabel = new Label(_("Hair color:"));
- mNextHairStyleButton = new Button("", "nextstyle", this);
- mPrevHairStyleButton = new Button("", "prevstyle", this);
- mPrevHairStyleButton->setButtonIcon("tab_arrows_left.png");
- mNextHairStyleButton->setButtonIcon("tab_arrows_right.png");
-
- mHairStyleLabel = new Label(_("Hair style:"));
mCreateButton = new Button(_("Create"), "create", this);
mCancelButton = new Button(_("Cancel"), "cancel", this);
mMale = new RadioButton(_("Male"), "gender");
@@ -112,12 +100,6 @@ CharCreateDialog::CharCreateDialog(CharSelectDialog *parent, int slot):
mNameLabel->setPosition(5, 5);
mNameField->setDimension(
gcn::Rectangle(45, 5, w - 45 - 7, mNameField->getHeight()));
- mPrevHairColorButton->setPosition(90, 35);
- mNextHairColorButton->setPosition(165, 35);
- mHairColorLabel->setPosition(5, 40);
- mPrevHairStyleButton->setPosition(90, 64);
- mNextHairStyleButton->setPosition(165, 64);
- mHairStyleLabel->setPosition(5, 70);
mAttributesLeft->setPosition(15, 280);
updateSliders();
mCancelButton->setPosition(
@@ -136,16 +118,36 @@ CharCreateDialog::CharCreateDialog(CharSelectDialog *parent, int slot):
if (mHairColorsIds.size() > 1)
{
- add(mNextHairColorButton);
- add(mPrevHairColorButton);
- add(mHairColorLabel);
+ auto hairColorLabel = new Label(_("Hair color:"));
+ auto nextHairColorButton = new Button("", "nextcolor", this);
+ auto prevHairColorButton = new Button("", "prevcolor", this);
+ prevHairColorButton->setButtonIcon("tab_arrows_left.png");
+ nextHairColorButton->setButtonIcon("tab_arrows_right.png");
+
+ hairColorLabel->setPosition(5, 40);
+ prevHairColorButton->setPosition(90, 35);
+ nextHairColorButton->setPosition(165, 35);
+
+ add(nextHairColorButton);
+ add(prevHairColorButton);
+ add(hairColorLabel);
}
if (mHairStylesIds.size() > 1)
{
- add(mNextHairStyleButton);
- add(mPrevHairStyleButton);
- add(mHairStyleLabel);
+ auto hairStyleLabel = new Label(_("Hair style:"));
+ auto nextHairStyleButton = new Button("", "nextstyle", this);
+ auto prevHairStyleButton = new Button("", "prevstyle", this);
+ prevHairStyleButton->setButtonIcon("tab_arrows_left.png");
+ nextHairStyleButton->setButtonIcon("tab_arrows_right.png");
+
+ hairStyleLabel->setPosition(5, 70);
+ prevHairStyleButton->setPosition(90, 64);
+ nextHairStyleButton->setPosition(165, 64);
+
+ add(nextHairStyleButton);
+ add(prevHairStyleButton);
+ add(hairStyleLabel);
}
add(mAttributesLeft);
diff --git a/src/gui/charcreatedialog.h b/src/gui/charcreatedialog.h
index 324e9fa2..f1759650 100644
--- a/src/gui/charcreatedialog.h
+++ b/src/gui/charcreatedialog.h
@@ -81,12 +81,6 @@ class CharCreateDialog : public Window, public gcn::ActionListener
gcn::TextField *mNameField;
gcn::Label *mNameLabel;
- Button *mNextHairColorButton;
- Button *mPrevHairColorButton;
- gcn::Label *mHairColorLabel;
- Button *mNextHairStyleButton;
- Button *mPrevHairStyleButton;
- gcn::Label *mHairStyleLabel;
gcn::RadioButton *mMale;
gcn::RadioButton *mFemale;
diff --git a/src/gui/skilldialog.cpp b/src/gui/skilldialog.cpp
index b830064a..0c223d80 100644
--- a/src/gui/skilldialog.cpp
+++ b/src/gui/skilldialog.cpp
@@ -43,7 +43,6 @@
#include "resources/resourcemanager.h"
#include "resources/theme.h"
-#include "utils/dtor.h"
#include "utils/gettext.h"
#include "utils/stringutils.h"
#include "utils/xml.h"
@@ -104,19 +103,19 @@ public:
void updateVisibilities();
- void addSkill(SkillInfo *info)
- { mSkills.push_back(info); }
+ void addSkill(std::unique_ptr<SkillInfo> info)
+ { mSkills.push_back(std::move(info)); }
private:
- std::vector<SkillInfo *> mSkills;
+ std::vector<std::unique_ptr<SkillInfo>> mSkills;
std::vector<SkillInfo *> mVisibleSkills;
};
class SkillListBox : public ListBox
{
public:
- SkillListBox(SkillModel *model):
- ListBox(model)
+ SkillListBox(SkillModel *model)
+ : ListBox(model)
{}
SkillInfo *getSelectedInfo()
@@ -171,8 +170,8 @@ public:
class SkillTab : public Tab
{
public:
- SkillTab(const std::string &name, SkillListBox *listBox):
- mListBox(listBox)
+ SkillTab(const std::string &name, SkillListBox *listBox)
+ : mListBox(listBox)
{
setCaption(name);
}
@@ -180,7 +179,6 @@ public:
~SkillTab() override
{
delete mListBox;
- mListBox = nullptr;
}
SkillInfo *getSelectedInfo()
@@ -240,12 +238,11 @@ void SkillDialog::action(const gcn::ActionEvent &event)
std::string SkillDialog::update(int id)
{
auto i = mSkills.find(id);
-
if (i != mSkills.end())
{
- SkillInfo *info = i->second;
- info->update();
- return info->name;
+ SkillInfo &info = *i->second;
+ info.update();
+ return info.name;
}
return std::string();
@@ -258,9 +255,7 @@ void SkillDialog::update()
mPointsLabel->adjustSize();
for (auto &skill : mSkills)
- {
skill.second->update();
- }
}
void SkillDialog::event(Event::Channel channel, const Event &event)
@@ -295,7 +290,7 @@ void SkillDialog::clearSkills()
}
}
- delete_all(mSkills);
+ mSkillModels.clear();
mSkills.clear();
}
@@ -308,9 +303,6 @@ void SkillDialog::loadSkills()
int setCount = 0;
std::string setName;
- ScrollArea *scroll;
- SkillListBox *listbox;
- SkillTab *tab;
if (!root || root.name() != "skills")
{
@@ -318,31 +310,33 @@ void SkillDialog::loadSkills()
if (Net::getNetworkType() == ServerType::TMWATHENA)
{
- auto *model = new SkillModel();
- auto *skill = new SkillInfo;
+ auto model = std::make_unique<SkillModel>();
+ auto skill = std::make_unique<SkillInfo>();
skill->id = 1;
skill->name = "basic";
skill->setIcon(std::string());
skill->modifiable = true;
skill->visible = true;
- skill->model = model;
+ skill->model = model.get();
skill->update();
- model->addSkill(skill);
- mSkills[1] = skill;
+ mSkills[1] = skill.get();
+ model->addSkill(std::move(skill));
model->updateVisibilities();
- listbox = new SkillListBox(model);
- scroll = new ScrollArea(listbox);
+ auto listbox = new SkillListBox(model.get());
+ auto scroll = new ScrollArea(listbox);
scroll->setOpaque(false);
scroll->setHorizontalScrollPolicy(ScrollArea::SHOW_NEVER);
scroll->setVerticalScrollPolicy(ScrollArea::SHOW_ALWAYS);
- tab = new SkillTab("Skills", listbox);
+ auto *tab = new SkillTab("Skills", listbox);
mTabs->addTab(tab, scroll);
+ mSkillModels.push_back(std::move(model));
+
update();
}
return;
@@ -356,7 +350,7 @@ void SkillDialog::loadSkills()
setCount++;
setName = set.getProperty("name", strprintf(_("Skill Set %d"), setCount));
- auto *model = new SkillModel();
+ auto model = std::make_unique<SkillModel>();
for (auto node : set.children())
{
@@ -366,34 +360,37 @@ void SkillDialog::loadSkills()
std::string name = node.getProperty("name", strprintf(_("Skill %d"), id));
std::string icon = node.getProperty("icon", "");
- auto *skill = new SkillInfo;
+ auto skill = std::make_unique<SkillInfo>();
skill->id = id;
skill->name = name;
skill->setIcon(icon);
skill->modifiable = false;
skill->visible = false;
- skill->model = model;
+ skill->model = model.get();
skill->update();
- model->addSkill(skill);
+ mSkills[id] = skill.get();
- mSkills[id] = skill;
+ model->addSkill(std::move(skill));
}
}
model->updateVisibilities();
- listbox = new SkillListBox(model);
- scroll = new ScrollArea(listbox);
+ auto listbox = new SkillListBox(model.get());
+ auto scroll = new ScrollArea(listbox);
scroll->setOpaque(false);
scroll->setHorizontalScrollPolicy(ScrollArea::SHOW_NEVER);
scroll->setVerticalScrollPolicy(ScrollArea::SHOW_ALWAYS);
- tab = new SkillTab(setName, listbox);
+ auto tab = new SkillTab(setName, listbox);
mTabs->addTab(tab, scroll);
+
+ mSkillModels.push_back(std::move(model));
}
}
+
update();
}
@@ -403,9 +400,9 @@ void SkillDialog::setModifiable(int id, bool modifiable)
if (it != mSkills.end())
{
- SkillInfo *info = it->second;
- info->modifiable = modifiable;
- info->update();
+ SkillInfo &info = *it->second;
+ info.modifiable = modifiable;
+ info.update();
}
}
@@ -414,12 +411,8 @@ void SkillModel::updateVisibilities()
mVisibleSkills.clear();
for (auto &skill : mSkills)
- {
if (skill->visible)
- {
- mVisibleSkills.push_back(skill);
- }
- }
+ mVisibleSkills.push_back(skill.get());
}
void SkillInfo::update()
diff --git a/src/gui/skilldialog.h b/src/gui/skilldialog.h
index 04810e74..c69e3d9b 100644
--- a/src/gui/skilldialog.h
+++ b/src/gui/skilldialog.h
@@ -27,10 +27,13 @@
#include <guichan/actionlistener.hpp>
#include <map>
+#include <memory>
+#include <vector>
class Button;
class Label;
class ScrollArea;
+class SkillModel;
class Tab;
class TabbedArea;
@@ -45,7 +48,6 @@ class SkillDialog : public Window, public gcn::ActionListener, public EventListe
{
public:
SkillDialog();
-
~SkillDialog() override;
void event(Event::Channel channel, const Event &event) override;
@@ -74,7 +76,8 @@ class SkillDialog : public Window, public gcn::ActionListener, public EventListe
bool hasSkills() { return !mSkills.empty(); }
private:
- std::map<int, SkillInfo *> mSkills;
+ std::vector<std::unique_ptr<SkillModel>> mSkillModels;
+ std::map<int, SkillInfo*> mSkills;
TabbedArea *mTabs;
Label *mPointsLabel;
Button *mIncreaseButton;
diff --git a/src/gui/socialwindow.cpp b/src/gui/socialwindow.cpp
index 37dc14dc..fcc19673 100644
--- a/src/gui/socialwindow.cpp
+++ b/src/gui/socialwindow.cpp
@@ -236,6 +236,11 @@ private:
class PlayerList : public AvatarListModel
{
public:
+ ~PlayerList() override
+ {
+ delete_all(mPlayers);
+ }
+
void setPlayers(const std::vector<Avatar*> &players)
{
delete_all(mPlayers);
@@ -273,7 +278,7 @@ public:
mScroll->setVerticalScrollPolicy(gcn::ScrollArea::SHOW_AUTO);
}
- ~PlayerListTab()
+ ~PlayerListTab() override
{
delete mPlayerList;
}
diff --git a/src/net/tmwa/chathandler.cpp b/src/net/tmwa/chathandler.cpp
index 4f998922..f9061f63 100644
--- a/src/net/tmwa/chathandler.cpp
+++ b/src/net/tmwa/chathandler.cpp
@@ -271,7 +271,7 @@ void ChatHandler::handleMessage(MessageIn &msg)
msg.readInt8(); // gm level
msg.readInt8(); // gender
- Avatar *avatar = new Avatar(nick);
+ auto *avatar = new Avatar(nick);
avatar->setOnline(true);
players.push_back(avatar);
}
diff --git a/src/resources/settingsmanager.cpp b/src/resources/settingsmanager.cpp
index 5314b4c8..789b8b75 100644
--- a/src/resources/settingsmanager.cpp
+++ b/src/resources/settingsmanager.cpp
@@ -36,7 +36,6 @@
#include "configuration.h"
#include "log.h"
-#include "statuseffect.h"
#include "units.h"
namespace SettingsManager
diff --git a/src/units.cpp b/src/units.cpp
index fd01afd8..ee8fa6ea 100644
--- a/src/units.cpp
+++ b/src/units.cpp
@@ -112,8 +112,7 @@ void Units::readUnitNode(XML::Node node, const std::string &filename)
if (uLevel.name() == "level")
{
UnitLevel ul;
- ul.symbol = uLevel.getProperty("symbol",
- strprintf("¤%d",level));
+ ul.symbol = uLevel.getProperty("symbol", strprintf("¤%d", level));
ul.count = uLevel.getProperty("count", -1);
ul.round = uLevel.getProperty("round", bu.round);