はじめまして。詳しい方がいたらご教授頂きたいのですが。
C++で書いたコードをビルドしてLinuxでの実行したところ
Abortが発生して困っています。
マルチスレッドを使用するようなコードで、あるインスタンス消滅時にアボートが発生して終了します・・・。
(1)アボートってなぜ出るのでしょうか?
(2)以下のエラーが出ますが、原因は何か分かりません。
-------------------------------------
pure virtual method called
terminate called without an active exception
Aborted
-------------------------------------
環境は、
SUSE Linux v10.0
g++ (GCC) 4.0.2 20050901
GNU Make 3.80
です。
どなたか詳しい方、ご協力お願い致します!!
No.7ベストアンサー
- 回答日時:
> 間接的に呼び出す場合はコンパイルできますね。
> まあ、こういうケースは経験したことがなかったので候補に挙げませんでした。
ありゃま。。専門家(笑)じゃ、コンパイラのバグでもないということかな。。まっ、どっちゃでもいいか^^;
ご親切に回答ありがとうございます。
> サンプルをコンパイル・リンクして実行したら、同じようなメッセージが
> 出ますし(笑)goopon さんもエラーの出た実際のコードで、純粋仮想関
> 数が呼び出されるようなことはないか、一度、コードを読んで確認される
> のがいいかと思いますよ^^
アドバイスをもとにコード見直しました。
確かに純粋仮想関数はあるものの、特に基底クラスで呼び出すようなまずいコーディングはしていません。
ですが試しに純粋仮想関数をなくしてみた(空実装させた)ところ、Abortは発生しなくなりました。
明確な理由は分からないままですが、とりあえず解決させることができそうです。
ありがとうございました。
No.6
- 回答日時:
てか、g++ v.4.1.1 が賢くないコンパイラだということかな^^
Stroustrup の『C++の設計と進化』初版 ソフトバンクのp.359 に
==
…
public:
virtual void f() = 0;
void g();
A();
};
A::A() {
f(); // エラー: 純粋仮想関数が呼ばれた
g(); // これは無害のようだ
}
A::f() の不法な呼び出しは、コンパイラが容易に補足できる。しかし A::g() はほかの翻訳単位の中でこんな定義かもしれない:
void A::g() { f(); }
その場合は、複数のコンパイル単位にわたって分析するコンパイルでなければエラーを検出できない。代わりにランタイムエラーをだすことになるだろう。
==
とありますが、今は、検出できないと標準準拠じゃないコンパイラになるということですね。
しかし、仮にコンパイラのバグだとしても goopon さんの場合は、g++ のようなので、純粋仮想関数の呼び出しをしてるんじゃないでしょうかね^^
サンプルをコンパイル・リンクして実行したら、同じようなメッセージが出ますし(笑)goopon さんもエラーの出た実際のコードで、純粋仮想関数が呼び出されるようなことはないか、一度、コードを読んで確認されるのがいいかと思いますよ^^
No.4
- 回答日時:
> コンストラクタやデストラクタで純粋仮想関数を呼び出すコードを書くとエラーになるので…
あっ、そうなんですか^^
では、No.1 のサンプルは g++ v.4.1.1 でコンパイル・リンクできるので、コンパイラのバグなんでしょうね(笑)勉強になりました。
No.3
- 回答日時:
コンストラクタやデストラクタで純粋仮想関数を呼び出すコードを書くとエラーになるので、たぶん違うかと思います。
このメッセージは、
1. おかしなポインタを用いてメンバ関数を実行しようとした。
2. スタック破壊などが発生し、すでにプログラムが破綻している。
3. コンパイラの最適化バグ
の場合に見た記憶があります。
No.2
- 回答日時:
あぁ、デストラクタのユーザコードが実行される前に、仮想テーブルが置き換わるので、~A() の中の g() 内から呼ばれる f() は B::f() ではなく、A::f() が呼ばれるんだと思います。
純粋仮想関数はなんらかのチェックをすり抜けて呼び出された場合を考慮して、abort() を呼び出すようになってるんだと思います。No.1
- 回答日時:
abort() :
http://www.linux.or.jp/JM/html/LDP_man-pages/man …消滅時というから、デストラクタの中で、純粋仮想関数を呼び出しているとかじゃないんですかね?以下のようなことをしているとエラーになりますけどね^^ これとは、違う原因かな??
====
#include <iostream>
struct A {
virtual void f() = 0;
virtual void g() { f(); }
~A() { g(); }
};
struct B : A
{
void f() { std::cout << "B::f()\n"; }
};
int main()
{
B b;
}
=====
$ ./a.exe
pure virtual method called
terminate called without an active exception
Aborted (core dumped)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux Kali Linuxで起動できない - Minimal BASH Like Line Editing 1 2022/06/03 13:14
- その他(OS) CloudreadyでLinuxのセットアップが出来無い 1 2022/04/06 12:36
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- Excel(エクセル) Excel2010 VBAが特定動作で実行出来なくなる 7 2022/12/29 14:26
- その他(ソフトウェア) ソフトが異常終了します 1 2022/08/28 01:41
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
- クーポン・割引券 株主割引券(JAL) 3 2022/11/13 16:04
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
秘密基地、どこに作った?
小さい頃、1度は誰もが作ったであろう秘密基地。 大人の今だからこそ言える、あなたの秘密基地の場所を教えてください!
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
ギリギリ行けるお一人様のライン
おひとり様需要が増えているというニュースも耳にしますが、 あなたが「ギリギリ一人でも行ける!」という場所や行為を教えてください
-
C言語 エラーの原因がわからないので,見てほしいです
C言語・C++・C#
-
既定のコンストラクタがありません。というエラーについて
C言語・C++・C#
-
C言語 配列の長さの上限
C言語・C++・C#
-
-
4
【gcc・cygwin】multiple definitionエラーの解決法
C言語・C++・C#
-
5
「fatal error C1189」を回避するには?
C言語・C++・C#
-
6
スレッドの安全な終了のさせ方
C言語・C++・C#
-
7
cout と cerrの違い
C言語・C++・C#
-
8
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
9
ファイルやディレクトリの存在確認を行う方法
C言語・C++・C#
-
10
C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C言語・C++・C#
-
11
#include <Windows.h>というヘッダファイルについて
C言語・C++・C#
-
12
C++で空Enterの入力を判断したい!!
C言語・C++・C#
-
13
変数の値が勝手に変化する原因
C言語・C++・C#
-
14
【C++】関数ポインタの使い方
C言語・C++・C#
-
15
適切な変換関数が存在しない???
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
コンパイルできない
-
C++でアボート(Abort)で処理が...
-
io.hをincludeするとそのような...
-
fortranでのNaNについて
-
PICマイコンによる乱数の表示に...
-
C++ で、「)」が必要 というエ...
-
コンパイラについて
-
C言語
-
__extension__
-
Eclipseの環境設定について
-
不要なインクルードファイルの検出
-
VBAで仕様書は書きますか?
-
あるプログラムのコマンドライ...
-
正しい五十音順について
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
期間重複チェックがわかりません
-
変数の値が勝手に変化する原因
-
EXCELなどで「返す」という表現
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++ で、「)」が必要 というエ...
-
コンパイルできない
-
C++でアボート(Abort)で処理が...
-
io.hをincludeするとそのような...
-
コンパイラについて
-
Eclipseの環境設定について
-
どのプログラミング言語ででき...
-
C言語のワーニングメッセージの...
-
PICマイコンによる乱数の表示に...
-
変数(関数)名の頭に_
-
ccコマンドの使い方
-
fortranでのNaNについて
-
__extension__
-
Visual C++とVisual C++.NETの違い
-
C言語
-
初心者はIDE使わないほうが良く...
-
関数の戻り値による変数の初期化
-
ABAQUS ユーザーサブルーチン...
-
graph.hがincludeできない
おすすめ情報