
はじめまして。詳しい方がいたらご教授頂きたいのですが。
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も見ています
-
C言語 エラーの原因がわからないので,見てほしいです
C言語・C++・C#
-
socket: recvはいつ,どれだけ受け取るのか?
C言語・C++・C#
-
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
-
4
スレッドの安全な終了のさせ方
C言語・C++・C#
-
5
シグナル 6(SIGABRT)とは?
C言語・C++・C#
-
6
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
7
SetDlgItemTextの使い方について
C言語・C++・C#
-
8
C言語での引数の省略方法
C言語・C++・C#
-
9
CStringをwchar_tに変換したい
C言語・C++・C#
-
10
C言語 配列の長さの上限
C言語・C++・C#
-
11
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
12
newしないオブジェクトについて
C言語・C++・C#
-
13
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
14
既定のコンストラクタがありません。というエラーについて
C言語・C++・C#
-
15
C++で空Enterの入力を判断したい!!
C言語・C++・C#
-
16
適切な変換関数が存在しない???
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数の返す値で直接Bitをセット...
-
ccコマンドの使い方
-
Fortranのサブルーチン呼び出し...
-
LALRで解析できてLLで出来ない...
-
C++ で、「)」が必要 というエ...
-
インライン展開でコンパイラが...
-
ABAQUS ユーザーサブルーチン...
-
GNUコンパイラとIntelコンパイ...
-
javaと.net frameworkの性能に...
-
VisualC++でコンパイル、Linux...
-
コンパイラについて
-
C用ビルダー
-
C++でアボート(Abort)で処理が...
-
__extension__
-
Mingwでコンパイルする場合のプ...
-
DOS環境でコンパイルするとヒー...
-
移植性の高いmakefileの作成
-
コンパイラフラグ(compiler fla...
-
初心者はIDE使わないほうが良く...
-
関数の戻り値による変数の初期化
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++でアボート(Abort)で処理が...
-
C++ で、「)」が必要 というエ...
-
io.hをincludeするとそのような...
-
コンパイラの制限 : ヒープの領...
-
不要なインクルードファイルの検出
-
どのプログラミング言語ででき...
-
Eclipseの環境設定について
-
コンパイルできない
-
初心者はIDE使わないほうが良く...
-
FORTRAN→Cに翻訳
-
fortranでのNaNについて
-
関数の戻り値による変数の初期化
-
ABAQUS ユーザーサブルーチン...
-
sprintfを用いたフォーマット文...
-
__extension__
-
変数(関数)名の頭に_
-
makeのエラーについて
-
volatile修飾について
-
C言語のワーニングメッセージの...
おすすめ情報