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

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

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

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

Q&A

解決済

4回答

6038閲覧

クラスのインスタンスから配列を確保したらスタックオーバーフローが起きます

seri

総合スコア422

C++

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

0グッド

0クリップ

投稿2016/10/24 22:57

以下の関数を呼び出した際にエラーは起きないのですが

C++

1//Main.h 2Class Main{ 3void A(){ 4unsigned char pixels[1024*1024]; 5} 6}

以下のようなクラスを新しく作成し

C++

1//Sub.h 2class Sub{ 3 4class hoge{ 5unsigned char pixels[1024*1024]; 6} 7 8} 9

以下のようにした場合エラーがおきます

C++

1#include "Sub.h" 2Class Main{ 3Sub::hoge H; 4}

エラーは以下です
原因がわかりません。。

//chkstk test dword ptr [eax],eax ; probe page.

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

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

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

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

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

guest

回答4

0

どうやら、エラーがでた後、途中で強制終了したせいで、スタックに不具合が起き、前回のエラーを残したままデバックを続けていたようです
一度PCを終了し、サイズを小さくして再稼働したらうまくいきました。ありがとうございます!

投稿2016/10/25 02:00

seri

総合スコア422

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

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

0

ベストアンサー

こんにちは。

A();で起きなくてhoge獲得で起きるのが不思議なのでやってみました。
いくつか手を入れましたが、どちらもスタックオーバーフローは起きます。
ただし、A()の方はスタック・チェックされないようです。結果、hogeよりも少し大きめの配列を獲得することでtest dword ptr [eax],eaxではない形で異常終了します。
スタックオーバーフローが起きても顕在化してないだけですね。

回避するにはスタックサイズを大きくすればできます。
msvc 2015の場合はプロジェクトのプロパティ→リンカー→システムの「スタックのサイズの設定」です。
4,000,000なら起きないと思います。

投稿2016/10/25 01:59

Chironian

総合スコア23272

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

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

0

以下の関数を呼び出した際にエラーは起きないのですが

本当にA()関数を呼びましたか? 呼べば必ずエラーになるはずです。

おそらくMainクラスをローカル変数としてインスタンス化しただけだと思いますが、メンバ関数内で変数を定義してもクラスのサイズには影響しません。

以下のようにした場合エラーがおきます

Subクラスにメンバ変数として1MBのサイズの配列を記述し、そのSubクラスをMainクラスのメンバ変数にしているので、Mainクラスのサイズは1MBになります。

ローカル変数のインスタンスはスタック領域に確保されるので、サイズが1MBのクラスをインスタンス化しようとするならスタック領域はそれを超えるサイズでなくてはなりません。ところが、Visual C++は既定で1MBに設定されています。当然のことながら領域が足りずにスタックオーバーフローになります。

大きなサイズの配列を使いたいのであればvectorをお使いください。

投稿2016/10/25 01:15

catsforepaw

総合スコア5938

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

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

0

関数内のローカル変数は、スタックというメモリ内の限られた領域に作られますが、このスタックはせいぜい数メガバイトしかないので、それを超えるような巨大なローカル変数を使おうとすると、スタックオーバーフローしてしまいます。

インスタンスごとにそれだけの領域が必要なら、newしてポインタだけ格納するしかなさそうです。

投稿2016/10/25 00:05

maisumakun

総合スコア145184

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問