🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

Q&A

解決済

1回答

7007閲覧

Critical error detected c0000374 の原因が知りたい。動的にメモリを確保することが危険とはどうすればいいのか?

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

0グッド

0クリップ

投稿2021/01/28 02:56

編集2021/01/28 05:11

提示コードのどこかで連続してこの関数を使ってシューティングゲームの弾をロードしてると必ずこのエラーが出るのですが参考サイトを見ると
動的に確保したメモリとありますがこの場合はでは new ですがこれが危険という場合どうすれば動的にメモリを確保すればいいのでしょうか?

アクセスエラー「 Critical error detected c0000374 」

参考サイト: https://cdecrement.blog.fc2.com/blog-entry-82.html

cpp

1#include "../Header/Texture.hpp" 2#include "../Header/Game.hpp" 3 4byte* LoadTexture(const char* str, int& width, int& height,int& channels ) 5{ 6 cv::Mat image; 7 image = cv::imread(str, cv::IMREAD_UNCHANGED); 8 9 10 //printf("image.channels: %d\n", image.channels()); // 3 11 12 if (image.empty() == true) 13 { 14 printf("image.empty()\n"); 15 return nullptr; 16 } 17 else { 18// printf("load \n"); 19 20 cv::cvtColor(image, image, cv::COLOR_BGRA2RGBA); 21 22// printf("channels: %d\n",image.channels()); //4 23 int size = image.rows * image.cols * image.channels(); 24 25 26// printf("size: %d\n", size); 27 byte* bytes = new byte[size]{ 0 }; 28 std::memcpy(bytes, (void*)image.data, (size_t)size); 29 30 // 画像サイズを取得 31 width = image.cols; // 横 32 height = image.rows; // 縦 33 34 channels = image.channels(); //チャンネル数を取得 35 36 37 return bytes; // unsigned char*を返す 38 } 39} 40

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

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

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

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

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

int32_t

2021/01/28 03:01

何の例外がどのコードから投げられますか? デバッガをアタッチして再現させて、例外が出るコードを特定してください。
退会済みユーザー

退会済みユーザー

2021/01/28 03:06 編集

コード部です。  itr = bullet.erase(itr); キー入力によりスペースボタンで弾を発射するのですがその時に 発生する時が必ず一回ではなく数回する必ず発生します。
int32_t

2021/01/28 03:45

まあ、Bulletのコピーコンストラクタかデストラクタで問題が出ているのでしょうから、その周辺を調べてみてください。 そもそもBulletはコピー不可にしたほうが問題が起きにくいと思いますけども。
guest

回答1

0

ベストアンサー

c0000374 ということはヒープ破壊してますから、エラーが発生するまでに実行されたあらゆるコードを精査して問題を見つけるしかありません。善意の他人がピンポイントでバグを見つけるとは期待しない方が良いでしょう。

ヒープ破壊の典型的な原因は、範囲外アクセスと多重開放です。多重開放はスマートポインタを使えば防げるので活用してください。

ちなみに、new byte[size] を開放するのに delete を使うのは間違いですが、それでヒープ破壊が起きるかどうかは知りません。こういう間違いも、スマートポインタで防ぐことができます。

投稿2021/01/28 06:10

編集2021/01/28 06:24
int32_t

総合スコア21679

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

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

退会済みユーザー

退会済みユーザー

2021/01/28 06:32

範囲外アクセスは避けられないのでしょうか?
int32_t

2021/01/28 06:51

配列の代わりにstd::vectorを使うと多少防げますが、完全な方法はないでしょうね。
退会済みユーザー

退会済みユーザー

2021/01/28 06:52

std::sharedとを使うことにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問