#質問内容
文章をコピー出来なかったので画像ですいません。以下の画像ですがなぜ「malloc.c : 2329: sysmalloc: Assertion」エラーが発生するのでしょうか? 提示コードですがEntryクラスのコンストラクタのChangeScene()関数でstd::make_unique<Edit>();コードで発生しているのですがそのEditクラスは問題ありませんでした。つまりstd::make_unique<Edit>();が原因なのですがなぜエラーが出るのでしょうか?
※C++ 14を使っています。
std::make_unique<Edit>();
$ make g++ -c -MMD -MP source/Edit.cpp -o obj/Edit.o In file included from /usr/include/c++/9/memory:80, from source/../header/Edit.hpp:5, from source/Edit.cpp:5: /usr/include/c++/9/bits/unique_ptr.h: In instantiation of ‘void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = Screen]’: /usr/include/c++/9/bits/unique_ptr.h:292:17: required from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = Screen; _Dp = std::default_delete<Screen>]’ source/Edit.cpp:9:22: required from here /usr/include/c++/9/bits/unique_ptr.h:79:16: error: invalid application of ‘sizeof’ to incomplete type ‘Screen’ 79 | static_assert(sizeof(_Tp)>0, | ^~~~~~~~~~~ make: *** [Makefile:11: obj/Edit.o] エラー 1
#include <stdlib.h> #include <iostream> #include <memory> #include "../header/Edit.hpp" #include "../header/Color.hpp" #include "../header/Log.hpp" // ######################## コンストラクタ ######################## Edit::Edit(): Scene() { mousePosition.x = 0; mousePosition.y = 0; int t = 1; for(int i = 0; i < 8; i++) { for(int j = 0; j<8; j++) { init_pair(t, i, j); t++; } } //screen = std::make_unique<Screen>(); //前景 changeScene = Scene::SceneType::Edit; //現在のシーン } // ######################## Keyboard Input ######################## void Edit::KeyInput() { int key = getch(); //ESCで終了 if(key == 27) { changeScene = Scene::SceneType::Exit; } } // ######################## Mouse Input ######################## void Edit::MouseInput() { //マウスイベント if(getmouse(&event) == OK) { //マウス座標 if(event.bstate & REPORT_MOUSE_POSITION) { mousePosition.x = event.x; mousePosition.y = event.y; } //Left click if(event.bstate & BUTTON1_PRESSED) { } //Right click if(event.bstate & BUTTON3_PRESSED) { } } erase(); move(mousePosition.y,mousePosition.x); //screen->Renderer(); refresh(); } //コンストラクタ Edit::~Edit() { }
#include "../header/Entry.hpp" #include <memory> //コンストラクタ Entry::Entry(): Scene() { nowScene = Scene::SceneType::Edit; //初期シーン ChangeScene(); //シーン推移 } void Entry::ChangeScene() { switch(nowScene) { case Scene::SceneType::Edit: { edit = std::make_unique<Edit>(); } break; //終了 case Scene::SceneType::Exit: { changeScene = Scene::SceneType::Exit; } break; } } //計算 void Entry::Update() { //changeScene = Scene::SceneType::Exit; edit->Update(); if(nowScene != edit->getChangeScene()) { std::cout<<(int)edit->getChangeScene()<<std::endl; //std::cout<<(int)nowScene<<std::endl; nowScene = edit->getChangeScene(); ChangeScene(); } } //描画 void Entry::Renderer()const { if(nowScene == Scene::SceneType::Edit) { edit->Renderer(); } } //デストラクタ Entry::~Entry() { }
makefile
1PRG :=AAEditor 2SRCDIR :=source 3OUTDIR :=obj 4DEP :=obj/%.d 5SRC := $(wildcard $(SRCDIR)/*.cpp) 6OBJ := $(addprefix $(OUTDIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC)))) 7$(PRG): $(OBJ) 8 $(CXX) -std=c++14 $^ -l ncurses -o $@ 9 10$(OUTDIR)/%.o: source/%.cpp 11 $(CXX) -c -MMD -MP $^ -o $@ 12-include $(DEP) 13 14clean: 15 rm -f ./obj/*.o *.out ./obj/*.d *.a $(PRG) 16
#include <stdlib.h> #include <iostream> //#include <memory> #include "../header/Edit.hpp" #include "../lib/ncurses/include/curses.h" // ######################## コンストラクタ ######################## Edit::Edit() : Scene() { mousePosition.x = 0; mousePosition.y = 0; int t = 1; for(int i = 0; i < 8; i++) { for(int j = 0; j<8; j++) { init_pair(t, i, j); t++; } } // screen = std::make_unique<Screen>(); //前景 //changeScene = Scene::SceneType::Edit; //現在のシーン } // ######################## Keyboard Input ######################## void Edit::KeyInput() { int key = getch(); //ESCで終了 if(key == 27) { // changeScene = Scene::SceneType::Exit; } } // ######################## Update ######################## void Edit::Update() { MouseInput(); KeyInput(); } // ######################## Renderer ######################## void Edit::Renderer()const { } // ######################## Mouse Input ######################## void Edit::MouseInput() { //マウスイベント if(getmouse(&event) == OK) { //マウス座標 if(event.bstate & REPORT_MOUSE_POSITION) { mousePosition.x = event.x; mousePosition.y = event.y; } //Left click if(event.bstate & BUTTON1_PRESSED) { } //Right click if(event.bstate & BUTTON3_PRESSED) { } } erase(); move(mousePosition.y,mousePosition.x); //screen->Renderer(); refresh(); } //デストラクタ Edit::~Edit() { }
#ifndef __ENTRY_HPP_ #define __ENTRY_HPP_ #include <iostream> #include "Scene.hpp" #include <memory> class Edit; class Entry : public Scene { public: Entry(); //コンストラクタ ~Entry(); //デストラクタ void Update(); //計算 void Renderer()const; //描画 void ChangeScene(); //シーン推移 private: std::unique_ptr<Edit> edit; Scene::SceneType nowScene; //現在のシーン }; #endif
回答2件
あなたの回答
tips
プレビュー