diff options
author | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2025-02-25 16:14:03 +0100 |
---|---|---|
committer | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2025-02-26 21:18:09 +0000 |
commit | 471bd7e5ba449d0a5c7267e960801426248cfaa9 (patch) | |
tree | d21909990a03b16746094935b550e676b008176d /src | |
parent | 593361ba81764dae93c02bd5bc4ee238db55aac1 (diff) | |
download | mana-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.cpp | 8 | ||||
-rw-r--r-- | src/actorspritemanager.h | 6 | ||||
-rw-r--r-- | src/avatar.h | 2 | ||||
-rw-r--r-- | src/game.cpp | 1 | ||||
-rw-r--r-- | src/gui/charcreatedialog.cpp | 50 | ||||
-rw-r--r-- | src/gui/charcreatedialog.h | 6 | ||||
-rw-r--r-- | src/gui/skilldialog.cpp | 79 | ||||
-rw-r--r-- | src/gui/skilldialog.h | 7 | ||||
-rw-r--r-- | src/gui/socialwindow.cpp | 7 | ||||
-rw-r--r-- | src/net/tmwa/chathandler.cpp | 2 | ||||
-rw-r--r-- | src/resources/settingsmanager.cpp | 1 | ||||
-rw-r--r-- | src/units.cpp | 3 |
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); |