質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1356閲覧

static スマートポインタ変数の生存期間について

退会済みユーザー

退会済みユーザー

総合スコア0

GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/07/05 05:41

提示コードのコメント部の囲ってるコードですが以下の変数なのですが

static FrameWork::windowContext

void Init();関数でmake_unique()されてその関数を抜けると次のMain関数でNULLになってしまうのですがこれはなぜでしょうか?
スマートポインタを使ったstatic 変数なのですが変数は生きてても生存期間は終了しているためNULLになるのでしょか?

イメージ説明

cpp

1#include "FrameWork.hpp" 2#include "Resource.hpp" 3 4#include <iostream> 5#include "FrameWork.hpp" 6#include "Player.hpp" 7 8 9int main() 10{ 11//////////////////////////////////////////////////////////////////////////////////////////////////////// 12 if (FrameWork::Init(glm::ivec2(48 * 26, 48 * 18), glm::ivec2(4, 5), "Dungeon") == false) 13 { 14 std::cerr << "初期化エラー" << std::endl; 15 } 16/////////////////////////////////////////////////////////////////////////////////////////////////////// 17 std::vector<FrameWork::Resource::Resource_File> file(0); 18 file.push_back(FrameWork::Resource::Resource_File{ "Shader/2D/BasicMono_2D.vert",FrameWork::Resource::Asset::shader_BasicMono_vert }); 19 file.push_back(FrameWork::Resource::Resource_File{ "Shader/2D/BasicMono_2D.frag",FrameWork::Resource::Asset::shader_BasicMono_frag }); 20 file.push_back(FrameWork::Resource::Resource_File{ "Shader/2D/BasicText_2D.vert",FrameWork::Resource::Asset::shader_BasicText_vert }); 21 file.push_back(FrameWork::Resource::Resource_File{ "Shader/2D/BasicText_2D.frag",FrameWork::Resource::Asset::shader_BasicText_frag }); 22 file.push_back(FrameWork::Resource::Resource_File{ "Shader/2D/BasicTexture_2D.vert",FrameWork::Resource::Asset::shader_BasicTexture_vert }); 23 file.push_back(FrameWork::Resource::Resource_File{ "Shader/2D/BasicTexture_2D.frag",FrameWork::Resource::Asset::shader_BasicTexture_frag }); 24 //file.push_back(FrameWork::Resource::Resource_File{ "Assets/debug_texture.png",FrameWork::Resource::Asset::player }); 25 file.push_back(FrameWork::Resource::Resource_File{ "Assets/texture_1.png",FrameWork::Resource::Asset::player }); 26 27 FrameWork::Resource::InputFile_Ok(file); 28 FrameWork::Resource::LoadShader(FrameWork::Resource::Asset::shader_BasicMono_vert); 29 FrameWork::Resource::LoadShader(FrameWork::Resource::Asset::shader_BasicMono_frag); 30 FrameWork::Resource::LoadShader(FrameWork::Resource::Asset::shader_BasicText_vert); 31 FrameWork::Resource::LoadShader(FrameWork::Resource::Asset::shader_BasicText_frag); 32 FrameWork::Resource::LoadShader(FrameWork::Resource::Asset::shader_BasicTexture_vert); 33 FrameWork::Resource::LoadShader(FrameWork::Resource::Asset::shader_BasicTexture_frag); 34 FrameWork::Resource::LoadTexture(FrameWork::Resource::Asset::player); 35 36 Player player; 37///////////////////////////////////////////////////////////////////////////////////////// 38 if (FrameWork::windowContext == NULL) 39 { 40 std::cout << "ああああ" << std::endl; 41 } 42//////////////////////////////////////////////////////////////////////////////////////// 43 while (*FrameWork::windowContext) 44 { 45 // FrameWork::windowContext->FrameUpdate(glm::vec4(0, 0, 0, 255.0f)); //フレーム更新 46 47 //player.Update(); 48 //player.Draw(); 49 50 51 //FrameWork::windowContext->SwapBuffers(); //ダブルバッファリング 52 //FrameWork::windowContext->Wait(); //フレームレート制御 53 } 54 55 56 return 0; 57} 58

cpp

1#include "Init.hpp" 2 3#include <glew/include/GL/glew.h> 4#include <glfw/include/GLFW/glfw3.h> 5 6#include "Window.hpp" 7 8namespace FrameWork 9{ 10 // ##################################### 初期化 ##################################### 11 bool Init(glm::ivec2 size,glm::ivec2 ver, const char* title) 12 { 13 setlocale(LC_CTYPE, ""); //ローカルを設定 14 15 16 if (glfwInit() == GL_FALSE) 17 { 18 std::cerr << "glfw初期化失敗。" << std::endl; 19 return false; 20 } 21 22/////////////////////////////////////////////////////////////////////////////////////////////////// 23 FrameWork::windowContext = std::make_unique<Window>(size, title); //ウインドウコンテキストを生成 24 25 if (FrameWork::windowContext == NULL) 26 { 27 std::cout << "ううううう" << std::endl; 28 } 29 30 std::cout << "yyy" << std::endl; 31//////////////////////////////////////////////////////////////////////////////////////////////////// 32 33 34 35 //OpenGL Verison 4.5 Core Profile を選択する 36 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, ver.x); 37 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, ver.y); 38 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 39 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 40 41 42 atexit(glfwTerminate); //プログラム終了時の処理を登録 43 44 return true; 45 } 46 47}

cpp

1#ifndef ___INIT_HPP 2#define ___INIT_HPP 3 4#include "glm/glm.hpp" 5#include <iostream> 6#include "Window.hpp" 7 8namespace FrameWork 9{ 10//////////////////////////////////////////////////////////////////////////////////////////// 11 static std::unique_ptr<Window> windowContext = 0; //ウインドウコンテキスト 12//////////////////////////////////////////////////////////////////////////////////////////// 13 bool Init(glm::ivec2 size, glm::ivec2 ver, const char* title); //初期化 14} 15#endif 16 17

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Init.hpp で static 変数の宣言および定義をしているようですが、 static 変数は翻訳単位 (.cpp) ごとの変数であり共有されるものではありません。
そのため、Init.hpp では extern として宣言をして Init.cpp で定義をするか、 C++17 が使える場合は inline 変数にしてしまうのが良いかと思います。

投稿2021/07/05 06:01

yaito3014

総合スコア209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問