メモリ解放
つまりこうなっていないとダメです。
IGadgets* GraphicGadget::createDivineGadget(std::string filepath, int AllNum, int XNum, int YNum, int XSize, int YSize) {
SpriteObject *sprite = new SpriteObject(filepath);
if (-1 == sprite->getOwner()) {
delete sprite;
return nullptr; // Cannot load a graphic file.
}
sprite->Divine(AllNum, XNum, YNum, XSize, YSize);
return sprite;
}
delete必須。
これは分からんですねぇ。
new をしてそのまま逃げられる場合があります。
上記の例、sprite->getOwner() で -1 ではなかった場合、Divineメソッドで画像をタイル状に切り裂いているのですが、その後 return して帰っていきます。
つまりこの中では delete (メモリの解放) をしてません。
しかしこのパターンではメモリリークしません。なぜでしょうね😅
その答えは、デザインパターンのカラクリがあって、デザインパターンというか継承のロジックで最終的にはメモリ解放をしているので、問題ないのです。
inline GraphicBank::GraphicBank() {
factory = new GraphicGadget();
}
inline GraphicBank::~GraphicBank() {
this->Delete();
delete factory;
}
inline bool GraphicBank::Delete(void) {
if (!handles_.empty()) {
for (auto &v : handles_) {
factory->deleteGadget(v);
}
handles_.clear();
handles_.shrink_to_fit();
}
label_.clear();
return true;
}
クラス分割であらゆる箇所に処理が飛びまくって分かりにくい!と仰るそこのあなた!
何を言うか😲
世の中スパゲッティコードを読める奴が神と崇められる存在なのだぞ。
とド阿呆な事を言うのは私だけです、はい😂
コメント