はじめまして。詳しい方がいたらご教授頂きたいのですが。
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#
-
既定のコンストラクタがない?
C言語・C++・C#
-
既定のコンストラクタがありません。というエラーについて
C言語・C++・C#
-
-
4
C言語 エラーの原因がわからないので,見てほしいです
C言語・C++・C#
-
5
エラーの原因は?「この関数の定義が見つかりません」
C言語・C++・C#
-
6
0xffffとは?
C言語・C++・C#
-
7
python エラー
その他(プログラミング・Web制作)
-
8
逆元の計算方法
数学
-
9
画面を強制的に再描画させる方法
C言語・C++・C#
-
10
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
11
WaitForSingleObjectの使い方について
C言語・C++・C#
-
12
Debug Assertion Failed?
C言語・C++・C#
-
13
変数の値が勝手に変化する原因
C言語・C++・C#
-
14
【C++】vectorについて
C言語・C++・C#
-
15
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
-
16
C 開放してるのにエラー(double free or corruption (!prev))がでる
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++ で、「)」が必要 というエ...
-
コンパイルできない
-
C言語
-
変数(関数)名の頭に_
-
コンパイラについて
-
ABAQUS ユーザーサブルーチン...
-
io.hをincludeしたプログラムで...
-
io.hをincludeするとそのような...
-
sprintfを用いたフォーマット文...
-
C言語のオススメ統合開発環境(...
-
PL/SQLで、区切りのスペースは...
-
C言語のワーニングメッセージの...
-
秀丸エディタでのC言語環境(ハ...
-
Eclipseの環境設定について
-
ブラウザ上でクライアント側で...
-
fortranでのNaNについて
-
コンパイラフラグ(compiler fla...
-
FORTRANとC++の連動について
-
Vba 実数および実数タイプの変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++ で、「)」が必要 というエ...
-
コンパイルできない
-
C++でアボート(Abort)で処理が...
-
変数(関数)名の頭に_
-
Visual C++とVisual C++.NETの違い
-
Eclipseの環境設定について
-
volatile修飾について
-
コンパイラについて
-
linuxのセキュリティ対策と致し...
-
__extension__
-
io.hをincludeするとそのような...
-
コンパイラフラグ(compiler fla...
-
PICマイコンによる乱数の表示に...
-
conio.h? curses.h?
-
【エラー】Cpadで初めてコンパイル
-
ABAQUS ユーザーサブルーチン...
-
関数の戻り値による変数の初期化
-
Delphiの逆コンパイル
-
プリコンパイラとは?
おすすめ情報