とりあえずコード(DLしたコードをそのまま貼っています)
#include <DxLib.h>
#include "Key.h"
#include "SystemMgr.h"
#include "Macro.h"
#include "CommonDefine.h"
#define WINDOW_TITLE "東方龍神録"
/*
* @brief コンストラクタ
*/
CSystemMgr::CSystemMgr(){
m_pGameMgr = nullptr;
m_pFpsCtrl = nullptr;
SetGraphMode( WIN_W, WIN_H, WIN_BITS ) ; //解像度設定
SetMainWindowText(WINDOW_TITLE); //ウィンドウタイトルをセット
ChangeWindowMode( TRUE ); //ウィンドウモードに変更
DxLib_Init(); //DXライブラリ初期化
SetDrawScreen( DX_SCREEN_BACK ); //描画先を裏画面に設定
SetOutApplicationLogValidFlag(FALSE); //ログ出力しない
SetAlwaysRunFlag(TRUE); //ウィンドウがノンアクティブでも実行
SetWindowSizeChangeEnableFlag(TRUE); //ウィンドウサイズを自由に変更できる
}
/*
* @brief デストラクタ
*/
CSystemMgr::~CSystemMgr(){
if(m_pGameMgr){
delete m_pGameMgr; m_pGameMgr=nullptr;
}
if( m_pFpsCtrl ){
delete m_pFpsCtrl; m_pFpsCtrl=nullptr;
}
DxLib_End(); //DXライブラリ終了処理
}
bool CSystemMgr::Initialize(){
if( m_pGameMgr == nullptr ){
m_pGameMgr = new CGameMgr(); //STGゲーム部のマネージャー
}
if( m_pFpsCtrl == nullptr ){
m_pFpsCtrl = new CFpsCtrl(); //FPSコントローラー(60FPSに保つもの)
}
m_pGameMgr->Initialize();
return true;
}
/*
* @brief 終了処理
*/
void CSystemMgr::Finalize(){
}
/*
* @brief ゲームのメインループ部
*/
void CSystemMgr::MainLoop(){
int t=0;
while( !ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !clsDx() ){
CKey::Inst()->Update(); //UIの状態更新
if( m_pGameMgr->Process() == false ){ //ゲーム処理
break;
}
m_pGameMgr->Draw(); //ゲーム描画
m_pFpsCtrl->Draw(); //FPS表示
m_pFpsCtrl->Wait(); //指定FSPを保つための待機
printfDx("Totl %2d[ms]\n", GetNowCount() - t ); t=GetNowCount();//1周の時間を処理表示
}
}
#include <DxLib.h>
#include "SystemMgr.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
CSystemMgr* pSystemMgr = new CSystemMgr;
if( pSystemMgr->Initialize() )
{
pSystemMgr->MainLoop();
}
pSystemMgr->Finalize();
delete pSystemMgr;
return 0;
}
ここで質問なのですが、
このmain文を見る限り、SystemMgrのmainloopが終わればアプリケーションが終了したということ思うのですが(あくまで「感覚的に」です)。
mainloopを終えたら、ウィンドウを閉じる(プリケーションの終了)しかない→デストラクタ(の記述)必要?という疑問が出てきました
「プリケーションを終了したらメモリはすべて解放される」と聞いたことがあるので、デストラクタで一々delete文を書かなくたって(アプリを終了したらメモリはすべて解放されるから)いいのでは?思った次第です。挙句の果てには「DxLib_End();」を消して実行してみました。
整理しますと、
デストラクタに書いてあるメモリ解放の文を消して実行ー>問題なく実行
DxLib_End();を消して実行ー>問題なく実行
実行されるのは当たり前なのですが。
デストラクタの記述は必要なのか?
そもそもmainファイルでdelete文は必要?(mainloopを抜けちゃったらあとはアプリを終了するしかないのだから)
「プリケーションを終了したらメモリはすべて解放される」というのはあっているのか?
明示的に書くことを避難しているわけではなく、「書かなくても大丈夫なのか?」というニュアンスの質問です。
※あくまで、この龍神録C++についての質問です。