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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

C++

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

Q&A

解決済

2回答

6762閲覧

「malloc.c : 2329: sysmalloc: Assertion」 実行エラーの原因が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

C++

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

0グッド

0クリップ

投稿2021/09/14 09:45

編集2021/09/14 11:20

#質問内容
文章をコピー出来なかったので画像ですいません。以下の画像ですがなぜ「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

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

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

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

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

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

episteme

2021/09/14 10:56

Edit.hpp みせて。
episteme

2021/09/14 10:59

実行エラーってなに? 実行時エラーのこと? コンパイルでエラー吐いてるから実行できないはずじゃ?
退会済みユーザー

退会済みユーザー

2021/09/14 11:07

提示文章を修正しました
episteme

2021/09/14 11:18

リンクエラーですか? コンパイルでエラー吐いてるからリンクできないはずじゃ?
退会済みユーザー

退会済みユーザー

2021/09/14 11:19

そうなのですが修正します
episteme

2021/09/14 11:22

で、そのメッセージは何したときに出たエラーなんですか?
退会済みユーザー

退会済みユーザー

2021/09/14 11:25

起動した瞬間なんですけど追跡したっけかこれらのクラスが関係しています
episteme

2021/09/14 11:26

なにを起動したんですか?
退会済みユーザー

退会済みユーザー

2021/09/14 11:27

普通にその今作ってるソフトです。
episteme

2021/09/14 11:29 編集

いやだから、コンパイルに失敗してるんだからそのソフトはできていないんでしょ? なんで実行できるんですか?
退会済みユーザー

退会済みユーザー

2021/09/14 11:33

そうですよ
退会済みユーザー

退会済みユーザー

2021/09/14 11:33

実行できません
episteme

2021/09/14 11:35

できてないのに「起動した瞬間...」とは?
退会済みユーザー

退会済みユーザー

2021/09/14 11:39

makeをクリーンしたらエラーになりました
episteme

2021/09/14 11:40

...ごめん、問題が理解できない。パス。
int32_t

2021/09/14 23:33

libcのmallocが実行時にヒープ破壊を検出して停止したのでしょう。
guest

回答2

0

ベストアンサー

スクリーンショットに出ているのは、libc の malloc が実行時にヒープ破損を検出して停止したメッセージ、「makeをクリーンしたらエラーになりました」のはコンパイルエラーですね。

原因としてあり得るのは、Makefile にヘッダへの依存関係が正しく記述されていなくて、screen.hpp を変更して Screen クラスのサイズが変わったのに Screen のインスタンスのメモリを確保するコードが再コンパイルされないまま足りないサイズを確保していて、新しいサイズ前提のコードがヒープ破壊を起こすことです。

投稿2021/09/14 23:49

int32_t

総合スコア21695

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

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

退会済みユーザー

退会済みユーザー

2021/09/15 00:05

screen.hppをインクルードしたら治ったのですがなぜでしょうか?
int32_t

2021/09/15 00:19 編集

もしこの問題の原因が回答に書いてあるとおりなら、clean してビルドし直せばとりあえずヒープ破壊の問題は直ります。 screen.hpp を入れるのはビルドを成功させるために必要なだけで、この問題の解決とはあまり関係ないでしょう。 cleanする前はビルドできていたのに cleanした直後にコンパイルエラーが出るというのは、Makefileでヘッダへの依存関係を正しく書けていない証拠です。
退会済みユーザー

退会済みユーザー

2021/09/15 02:26

なるほど。質問ですがmake fileの何が間違えているのでしょうか?
int32_t

2021/09/15 02:28

変数DEPが明らかにおかしいですが、それはまた別の質問にしてください。
guest

0

Edit.hppの

std::unique_ptr<Screen> screen;

に問題があり#include "screen.hpp"をインクルードしたら行けました。
原因はわかりません

投稿2021/09/14 12:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

episteme

2021/09/14 18:48

つまりコンパイルエラーやん...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問