こんにちは。
C++でシングルトンを勉強したので使おうと思ったのですが使ってみるとメモリリークしてしまいます。
静的なメンバはポインタで扱っています。
一応ユニークポインタでやると当たり前ですがメモリリークしませんでした。
そして結果的にわからないところがいくつかあります。
・ポインタでやるとなぜメモリリークするのか?...書き方間違ってる?
・ユニークポインタのインスタンスを作るときにmake_uniqueだとできないのに
reset(new GameData_unique())だとできるのか?なにが違う?
・ポインタとユニークポインタでやりましたがシングルトンの静的な変数はポインタとかユニークポインタやまだ知らないものがあると思いますが何を使うのがいいのでしょうか?
以上です。
わかる方いましたら教えてほしいです。
以下はコードです。
なにかありましたら連絡ください。
// 2行目で書いてたやつです。下にも書いてありますが、一応。 s_gamedata_unique.reset(new GameData_unique()); 下のほうでやるとコンパイルエラーが出てしまいます。 C2248 'GameData_unique::GameData_unique': private メンバー (クラス 'GameData_unique' で宣言されている) にアクセスできません。 singrutest C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.24.28314\include\memory 2054 //s_gamedata_unique = std::make_unique<GameData_unique>();
C++
1GameData.h=================================== 2/* 3 ポインタのシングルトン 4*/ 5#pragma once 6 7 8class GameData 9{ 10private: 11 12 // コンストラクタ 13 GameData() 14 : num() 15 {} 16 17 // なにかしらの値を保存する変数 18 float num; 19 20public: 21 22 // インスタンスを生成 23 static GameData* GetInstans() 24 { 25 // 生成されてないとき生成 26 if (s_gamedata == nullptr) 27 { 28 s_gamedata = new GameData(); 29 } 30 31 // インスタンスを返す 32 return s_gamedata; 33 } 34 35 // num のセッタゲッタ 36 void SetNum(float num) { this->num = num; } 37 float GetNum() { return num; } 38 39private: 40 41 // 静的メンバを宣言 42 static GameData* s_gamedata; 43 44}; 45============================================== 46 47GameData.cpp=================================== 48#include "GameData.h" 49 50// 初期化 51GameData* GameData::s_gamedata = nullptr; 52 53============================================== 54
C++
1GameData_unique.h============================================= 2 3/* 4 ユニークポインタのシングルトン 5*/ 6#pragma once 7 8#include <memory> 9 10 11 12class GameData_unique 13{ 14private: 15 16 // コンストラクタ 17 GameData_unique() 18 : num() 19 {} 20 21 // なにかしらの値を保存する変数 22 float num; 23 24public: 25 26 // インスタンスを生成 27 static GameData_unique* GetInstans() 28 { 29 // 生成されてないとき生成 30 if (s_gamedata_unique == nullptr) 31 { 32 s_gamedata_unique.reset(new GameData_unique()); 33 //s_gamedata_unique = std::make_unique<GameData_unique>(); 34 } 35 36 // インスタンスを返す 37 return s_gamedata_unique.get(); 38 } 39 40 // num のセッタゲッタ 41 void SetNum(float num) { this->num = num; } 42 float GetNum() { return num; } 43 44private: 45 46 // 静的メンバを宣言 47 static std::unique_ptr<GameData_unique> s_gamedata_unique; 48 49}; 50================================================================ 51 52GameData_unique.cpp============================================= 53#include "GameData_unique_ptr.h" 54 55// 初期化 56std::unique_ptr<GameData_unique> GameData_unique::s_gamedata_unique = nullptr; 57================================================================ 58
c++
1#include <crtdbg.h> 2#include <iostream> 3 4#include "GameData.h" // ポインタ 5#include "GameData_unique_ptr.h" // ユニークポインタ 6 7 8 9int main() 10{ 11 _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF); 12 13 14 std::cout << "ポインタ版のシングルトン============================" << std::endl; 15 16 // インスタンスを生成(ポインタ版) 17 GameData* gm = GameData::GetInstans(); 18 19 // 中身を表示 20 std::cout << gm->GetNum() << std::endl; 21 22 // 3.0fをセットする 23 gm->SetNum(3.0f); 24 25 // 中身を表示 26 std::cout << gm->GetNum() << std::endl; 27 28 29 std::cout << "ユニークポインタ版のシングルトン============================" << std::endl; 30 31 // インスタンスを生成(ユニークポインタ版) 32 GameData_unique* gm_unique = GameData_unique::GetInstans(); 33 34 // 中身を表示 35 std::cout << gm_unique->GetNum() << std::endl; 36 37 // 3.0fをセットする 38 gm_unique->SetNum(3.0f); 39 40 // 中身を表示 41 std::cout << gm_unique->GetNum() << std::endl; 42}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/16 02:43 編集
2021/07/16 03:41
2021/07/16 14:08
2021/07/17 02:58