C++で書いているソース内において、
setjmp・longjmpを挿入し、
プログラムを実行してみましたところ、
「セグメンテーション違反」ということで止まってしまいました。
どうして、そうなってしまったのか?が、
自分では解決に至らず、
質問させていただきます。
挿入す前はエラーなど出ませんでしたが、
長々と確認してみたところ、
「セグメンテーション違反」となった部分は、
やはり、挿入したsetjmp・longjmpの部分でした。
「test.c」というファイル内にて、
以下のとおり、setjmpをしかけております。
========================================
jmp_buf env;
if (setjmp(env) == 0) {
std::string food = get_air(key);
} else {
printf("test OK \n");
}
========================================
そして、
「test.c」とは別のファイルなんですが、
以下のとおり、
「get_air.h」というファイルにて、
「longjmp」をしかけております。
========================================
if (iterator != _container_air.end()) {
printf("## [info]get_the_air \n");
}
printf("## [info]fail to get \n");
longjmp(env, 1);
printf("Here is out of area.\n");
}
========================================
周囲に質問できる人が皆無なため、
「特に問題なさそうだよ」というのでも結構ですので、
何かアドバイスいただけると大変ありがたいです。
宜しくお願い致します。
No.2
- 回答日時:
#1さんがご回答なさっている通りです。
「
C++ Language Reference
Using setjmp/longjmp
Do not use setjmp and longjmp in C++ programs; these functions do not support C++ object semantics. Also, using these functions in C++ programs may degrade performance by preventing optimization on local variables. Use the C++ exception handling try/catch constructs instead.
If you must use setjmp/longjmp in a C++ program, the interaction between these functions and C++ exception handling requires that you include SETJMP.H or SETJMPEX.H. Destructors for local objects will be called during the stack unwind if you compile with /EH. If you compile with /EHs and one of your functions call a function that uses nothrow, and if the function that uses nothrow calls longjmp, the destructor unwind may not occur, depending on the optimizer.
Also, if you intend your code to be portable, do not rely on correct destruction of frame-based objects when executing a nonlocal goto using a call to longjmp.
」(from msdn)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
ビルドエラーの対処がわからな...
-
char型2つを結合し、short型に...
-
fatal error LNK1120: 外部参照...
-
reallocでエラー
-
2÷3などの余りについて
-
C言語での引数の省略方法
-
マイナスからプラスへ転じた時...
-
Aの値からBの値を除するとは??
-
「指定されたキャストは有効で...
-
エクセルで可視セルにのみ値貼...
-
「Aに対するBの割合」と「Aに対...
-
DWORDの実際の型は何でしょうか
-
正負を反転させて出力するプロ...
-
20'(角度)の計算がわかりま...
-
コンパイルエラーについて
-
for文の中にswitch文はいれられ...
-
ラップ関数とはどんなものですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
printf による16進表示について
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
C言語のプログラムで、途中で止...
-
reallocでエラー
-
【C言語】全角文字の配列を、全...
-
構造体メンバの初期化
-
char型2つを結合し、short型に...
-
空白を含んだ文字列がうまく格...
-
VC++でSQLへSELECT文を送ったの...
-
C言語でのCSVファイルの読み出...
-
エラーについて質問です。
-
矢印キーを押下してコンソール...
-
setjmp・longjmpに関しまして
-
タイムカードのシステムを作り...
-
大量のファイルを読み込み、そ...
-
Cでファイルの行数をカウントす...
-
受信データから必要な部分のみ...
-
C言語、ファイル操作、fgets()...
おすすめ情報