Я делаю игру с C ++ и SDL.Существует класс Screen .и есть классы StartScreen и MultiplaySettingScreen , которые наследуют класс Screen .
Я обнаружил на консоли, чтоКогда я покидаю всю игру, эти классы создаются по порядку, но для деконструкции, объект ' Screen ' не удаляется (освобождается), тогда как ' StartScreen ' и ' MultiplaySettingScreen 'объекты удалены (освобождены).Я думаю, что это утечка памяти.
Конструктор экрана ()!
Конструктор StartScreen ()!
Конструктор MultiplaySettingScreen ()!
...
Конструктор StartScreen ()!
Конструктор MultiplaySettingScreen ()!
Что происходит?Что я сделал не так?
вот код.
' Экран '
class Screen
{
protected:
SDL_Renderer *rend = nullptr;
GameObject *screen = nullptr;
GameObject *arrow = nullptr;
public:
Screen();
Screen(SDL_Renderer *renderer);
virtual ~Screen(){};
virtual void handleEvents(const Uint8 *keystate, bool *isSelecting, bool *isSingle, bool *isMulti){};
virtual void Update(){};
virtual void Render(){};
};
Screen::Screen()
{}
Screen::Screen(SDL_Renderer *renderer)
{
std::cout << "Screen constructor()!" << std::endl;
rend = renderer;
screen = new GameObject("images/startscreen.png", GAME_WIDTH, GAME_HEIGHT, 0, 0, "img");
arrow = new GameObject("images/arrow.png", 30, 30, 250, 330, "img");
}
'StartScreen '
class StartScreen: public Screen
{
public:
StartScreen(SDL_Renderer *renderer);
~StartScreen();
virtual void handleEvents(const Uint8 *keystate, bool *isSelecting, bool *isSingle, bool *isMulti);
virtual void Update();
virtual void Render();
};
StartScreen::StartScreen(SDL_Renderer *renderer): Screen(renderer)
{
std::cout << "StartScreen constructor()!" << std::endl;
singlePlayMode = new GameObject("SINGLE PLAY", MODE_WIDTH, MODE_HEIGHT, 300, 320);
multiPlayMode = new GameObject("MULTI PLAY", MODE_WIDTH, MODE_HEIGHT, 300, 380);
title = new GameObject("Pikachu Volleyball", 400, MODE_HEIGHT, 200, 50);
explaination = new GameObject("Press Enter on any mode..", 400, MODE_HEIGHT, 200, 200);
copyright = new GameObject("(C) Jinko, All rights reserved", 400, 50, 200, 500);
}
StartScreen::~StartScreen()
{
std::cout << "StartScreen deconstructor()!" << std::endl;
delete singlePlayMode;
delete multiPlayMode;
delete title;
delete explaination;
delete copyright;
delete arrow;
delete screen;
}
' MultiplaySettingScreen '
class MultiplaySettingScreen: public Screen
{
private:
std::string connectingIp = "127.0.0.1";
std::string connectingPort = "80";
public:
MultiplaySettingScreen();
~MultiplaySettingScreen();
virtual void handleEvents(const Uint8 *keystate, bool *isSelecting, bool *isSingle, bool *isMulti);
virtual void Update();
virtual void Render();
};
MultiplaySettingScreen::MultiplaySettingScreen()
{
std::cout << "MultiplaySettingScreen constructor()!" << std::endl;
host = new GameObject("Host", 400, 400, 200, 200);
guest = new GameObject("Guest", 400, 400, 300, 200);
ipInput = new GameObject("Connecting IP: ", 400, 200, 200, 200);
portInput = new GameObject("Connecting PORT: ", 400, 50, 200, 500);
SDL_StartTextInput();
if (SDLNet_Init() == -1)
std::cout << "SDLNET init failed" << std::endl;
IPaddress ip;
}
MultiplaySettingScreen::~MultiplaySettingScreen()
{
std::cout << "MultiplaySettingScreen deconstructor()!" << std::endl;
SDLNet_Quit();
delete host;
delete guest;
delete ipInput;
delete portInput;
}