teratail header banner
teratail header banner
質問するログイン新規登録
DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

1889閲覧

c++ メモリが勝手に書き換わってしまうバグや現象をなくすコーディング手法が知りたい。原因も知りたいです。

退会済みユーザー

退会済みユーザー

総合スコア0

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

2クリップ

投稿2020/01/29 12:04

0

2

提示コードの///////部で囲っているofs2を2行コメントしてあるところですがpos->に値が上手く行ってないのではと思いデバッグコマンドとしてテキストファイルに出力したらうまく動きバグが解決しました。これはメモリが勝手に書き換わるバグなのでしょうか?全く関係ない部分にコードを書き込んだだけで修正というコード修正は一切しておりません、C++における勝手にメモリが書き換わる原因や現象について知りたいので質問しました。 コードが断片的です。

#include "DxLib.h" #include <vector> #include <math.h> #include <fstream> #include "string.h" #include <iostream> #include <optional> //#include <memory> #include "Frame.h" #include "keyboard.h" #include "Position.h" #include "Player.h" Player::Player(){ /*計算*/ // pos = std::make_unique<Position>(); // speed = std::make_unique<Position>(); // Direction = std::make_unique<Position>(); pos = new Position(); speed = new Position(); Direction = new Position(); /*初期座標*/ pos->x = (6 * CELL); pos->y = (5 * CELL); State = new keyState; State_y = new keyState; isJump = false; isGround = false; /*描画*/ if (LoadDivGraph("Mario/resource/Mario_64px.png", 7, 7, 1, 64, 64, player_graph) == -1) { exit(1); } } /*Yの符号を逆にする関数*/ float Player::rev_y(float t) { return t * -1.0f; } /*等速直線運動のY 落下*/ void Player::gravity_force() { } std::ofstream ofs2("Log.txt"); /*移動処理*/ void Player::Move(keyState key,keyState action) { if (key == keyState::Left) { Direction->x = -1; speed->x = 4 * Direction->x; } else if(key == keyState::Right) { Direction->x = 1; speed->x = 4 * Direction->x; } else if (key == keyState::Invalid) { Direction->x = 0; speed->x = 0; } if (action == keyState::Up) { speed->y = -4; } else if (action == keyState::Down) { speed->y = 4; } else { speed->y = 0; } pos->x += speed->x; pos->y += speed->y; ////////////////////////////////////////////////////////////////// ofs2 << "speed->x: " << speed->x << std::endl; ofs2<<"speed->y: "<<speed->y<<std::endl; ////////////////////////////////////////////////////////////////// } /*-----------------------------計算----------------------------*/ void const Player::Update() { //DrawFormatString(0, 0, GetColor(255, 255, 255), "Pos: %.2f , %.2f", pos->x, pos->y, true); DrawFormatString(0, 0, GetColor(255, 255, 255), "Pos: %.2f , %.2f", pos->x, pos->y, true); //DrawFormatString(0, 32, GetColor(255, 255, 255), "speed: %.2f , %.2f", speed->x, speed->y, true); DrawFormatString(0, 32, GetColor(255, 255, 255), "speed: %.2f , %.2f", speed->x, speed->y, true); //DrawFormatString(200, 200, GetColor(255, 255, 255), "block: %.2f , %.2f", block.x, block.y, true); // DrawFormatString(200, 200, GetColor(255, 255, 255), "block: %.2f, %.2f", block.x, block.y, true); //DrawFormatString(400, 400, GetColor(255, 255, 255), "%d", block.x, block.y, true); // DrawFormatString(200,0,GetColor(255,255,255),"Frame: %d",Fps::now(),true); // DrawFormatString(300, 0, GetColor(255, 255, 255), "speed.x: %.2f", speed->x, true); // DrawFormatString(450, 0, GetColor(255, 255, 255), "speed.y: %.2f", speed->y, true); DrawFormatString(450, 100, GetColor(255, 255, 255), "isGround: %d", isGround, true); DrawFormatString(450, 120, GetColor(255, 255, 255), "isJump: %d", isJump, true); //DrawFormatString(100, 100, GetColor(255, 255, 255), "Right", true); // DrawFormatString(100, 100, GetColor(255, 255, 255), "%d",dd, true); } /*-------------------------------------------------------------------------------------------------*/ /*----------------------------描画-----------------------------*/ void const Player::Draw_Update() { DrawGraph((int)pos->x, (int)pos->y, player_graph[0], true); } /*------------------------------------------------------------*/

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

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

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

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

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

guest

回答1

0

ベストアンサー

「メモリが勝手に書き換わるバグ」というのはありません。
あるのは「メモリを意図しない箇所や内容に書き換えてしまうバグ」です。

書き換えてしまう場所と、他のデータとの位置関係によって、バグが発覚する場合もあるし、発覚しない場合もあります。
なので、「バグが発覚したので、デバッグコーディングを入れると、現象が出なくなった」というのは、よくあることです。

投稿2020/01/29 13:28

otn

総合スコア86356

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

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

退会済みユーザー

退会済みユーザー

2020/01/29 13:33

つまりどうすればそのようなコーディングミス以外のバグを防ぐことができるのでしょうか?
otn

2020/01/29 13:45 編集

バグなので、コーディングミスですよ。 正しいプログラムを書けばいいです。 ありがちなミスとしては、ポインタの扱いのミス、配列の添え字範囲オーバーなど。
退会済みユーザー

退会済みユーザー

2020/01/30 11:26

newは正しく確保されない可能性とかどうたらとかってありますか?
otn

2020/01/31 01:39

質問意図がよくわかりませんが、 書いたとおりに動かない可能性は無いです。
退会済みユーザー

退会済みユーザー

2020/01/31 02:10

スマートポインタやらnewはやるななどあれいいこれはよくないとか色々調べるとありますがどれが無難なのでしょうか?
otn

2020/01/31 05:31

ちょっとわかりませんが、 ベストかどうかはさておき、自分がきちんと理解している方法が良いと思います。
退会済みユーザー

退会済みユーザー

2020/01/31 13:19

結論としてnew delete は使っても自分の知らないとところで何かしらのデータが気変わってしまうというバグは考えられるのでしょうか?
otn

2020/01/31 14:06 編集

プログラムは思った通りじゃなくて書いた通りに動きますので、データが書き変わるコードを書いていれば書き変わるし、データが書き変わるコードを書いていなければ書き変わりません。 それを自分が知っているかどうかは、プログラムがどう書かれているかとは関係ないです。
otn

2020/01/31 14:07

というか、書き変わるかどうかは、new delete とは関係ないのでは? > ありがちなミスとしては、ポインタの扱いのミス、配列の添え字範囲オーバーなど。 と書いた通りです。そのあたりを重点的にチェックしてみては?
maisumakun

2020/01/31 14:26

> newは正しく確保されない可能性とかどうたらとかってありますか? 今どきの処理系であれば、確保できなければ例外を投げます。「確保に失敗した中途半端な状態で実行が続く」ことは考えなくていいです。
退会済みユーザー

退会済みユーザー

2020/01/31 14:29

つまりポインタとかのコーディングミスということですねわかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問