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

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

新規登録して質問してみよう
ただいま回答率
85.50%
デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

Q&A

解決済

2回答

4193閲覧

警告 [C26815 このポインターは、破棄された一時インスタンスを指しているため、ダングリング状態です。] の解決方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

0グッド

0クリップ

投稿2021/06/05 10:30

編集2021/06/05 12:01

提示コードですが下記の警告とデバッグエラーが発生するのですが警告コード対処法がわかりません。なぜでしょうか?
(*itr)->getWeapon().begin(); 部にて下記の警告文

イメージ説明

警告[ 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
警告 C26815 このポインターは、破棄された一時インスタンスを指しているため、ダングリング状態です。 Dungeon_Game C:\Users\KenMatsuzawa\Desktop\Dungeon_Game\Dungeon_Game\Game.cpp 260
]

cpp

1// std::vector<std::shared_ptr<Weapon>> getWeapon(); //攻撃を取得 2//攻撃を取得 3std::vector<std::shared_ptr<Weapon>> Enemy::getWeapon() 4{ 5 return attack; 6} 7

cpp

1if ( (windowContext->getFrame() % 45) == 0) 2 { 3 int t = FrameWork::GetRandom(0,4); 4 if (t == 4) 5 { 6 attack.push_back(std::make_shared<Magic>(windowContext, position, moveVec)); 7 } 8 else { 9 moveVec = t; 10 } 11 12 }

cpp

1 2 3 //プレイヤーダメージ判定 エネミー 4 for (std::vector<std::shared_ptr<Enemy>>::iterator itr = enemy.begin(); itr != enemy.end(); itr++) 5 { 6 for (std::vector<std::shared_ptr<Weapon>>::iterator it = (*itr)->getWeapon().begin(); it != (*itr)->getWeapon().end();) 7 { 8 if (player->EnemyAttackCollision((*it)->mCollision) == true) 9 { 10 it = (*itr)->getWeapon().erase(it); 11 } 12 else { 13 it++; 14 } 15 } 16 } 17

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

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

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

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

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

asm

2021/06/05 11:58

> (*itr)->getWeapon() ここで呼び出されているgetWeapon関数についての詳細をおねがいします。
退会済みユーザー

退会済みユーザー

2021/06/05 12:01

追加しました。
guest

回答2

0

ベストアンサー

std::vector<std::shared_ptr<Weapon>> Enemy::getWeapon()

これではattackのコピーを返しています。

c++

1std::vector<std::shared_ptr<Weapon>>& Enemy::getWeapon() 2{ 3 return attack; 4}

とする必要があります。

投稿2021/06/05 12:03

asm

総合スコア15147

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

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

0

以下の2つの質問が同様の問題なので、参考になると思います。

「インタンスのコピーを避ける」「あるクラスのデータメンバに対する操作は、そのクラスの関数メンバにする」というのを気を付けるとトラブルを避けられます。

投稿2021/06/06 15:16

編集2021/06/06 17:27
int32_t

総合スコア20659

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問