1. ホーム
  2. Qt

プロセスデッド、アクティブな例外なしで呼び出された終了、シグナル11

2022-02-16 01:03:44
<パス

問題の説明。
ビジネスプロセスが立ち上がり、すぐにフリーズしてしまう。コンソールを確認すると、信号11を受信している

問題分析。
1: ログを追加した結果、ct.hファイルでm_pmポインタを使用して、if(m_pm == NULL)などでプロセスが死んでいることがわかりました。
2: さらに、isUSAOG() 》 getCP() 関数による m_pm ポインタの使用のみがフリーズすることがわかり、他のコールパスは問題なく入ってきた。
3: そこで、isUSAOG()関数とgetCP()関数に if(m_pm == NULL) を追加し、業務処理を実行したところ、以下の現象が確認されました。
isUSAOG()関数のif(m_pm == NULL)は正常に実行されますが、getCP()のif(m_pm == NULL)ではプロセスが異常終了し、コンソールメッセージが表示されます。
アクティブな例外を発生させずに呼び出された終了
4: Baidu "terminate called without an active exception"。
一般的な意見としては、宣言しただけで、初期化もNULL代入もされていないポインタを使用した場合に発生すると言われています。

しかし、本当にそうなのでしょうか?
まずは理解を深めるために簡略化したコードを掲載しましょう(includeは省略)。

RU.h
クラスRU
{
をプライベートで使用することができます。
TU * m_tu;
}

RU.cpp
m_tu->isUSAOG();//m_tu は初期化され、その属性 m_pm も初期化される。

TU.h
クラスTU
{
を公開します。
bool isUSAOG()。
bool getCP()。
をプライベートで使用することができます。
PM * m_pm;//PM はクラスです。
TU * m_tu;
}

TU.cpp
ブール TU::getCP()
{
//if(m_pm == NULL){}.
D_P_P()です。
}
ブール TU::isUSAOG()
{
//if(m_pm == NULL){}.
m_tu->getCP();//このm_tuは宣言されただけで初期化されていません。
}

ct.h

define D_P_P() \

if(m_pm == NULL){}}

問題の解析の続き
5:問題分析3内部は、getCP()関数を入力する前に、もし(m_pmの== NULL)は正常であり、getCP()を入力した後、もし(m_pmの== NULL)が終了するプロセスが発生します、コンソールレポート終了アクティブ例外なしで呼ばれますことが判明したコードm_tu -&gt;の行は非常に疑わしいですgetCP();です。
6: もっとよく見てみると、不思議な現象が。getCP() と isUSAOG() はどちらも TU クラスの関数で、直接呼び出すことができ、より厳密にはこれを使う方法があります。しかしなぜここで m_tu ポインタが使われているのでしょう?このポインタはどこから来たのでしょうか?RUクラスのプロパティポインタであるm_tuとは、? RUクラスm_tuのプロパティへのポインタなのでしょうか?
7: N千行のコードを調べた結果、次のことがわかりました。コード行 m_tu->getCP(); の m_tu ポインターは .h で宣言されているだけで、初期化されていません。なんてこった、光が見えたぞ。
8: しかし、問題は再びやってきます。ウェブによると、ポインタを使用する場合、ポインタが宣言されているだけで、初期化もNULL代入もされていなければ、アクティブな例外なしに呼び出しを終了することが報告されます。また整理が必要なようです。
9: コード行 m_tu->getCP(); は、getCP() 関数を呼び出していますが、初期化せずに宣言しただけの m_tu ポインタの性質は変わりません。このm_tuポインタの場合、プロパティポインタm_pmは単に存在せず、存在しないポインタを使用した場合の結果は深刻である。
10: ここまでは、比較的明確で曖昧さのない問題です。宣言されているだけで初期化もNULL代入もされていないポインタm_tuがgetCP()関数を呼び出すが、関数内で存在しないポインタm_pmを使うと、プロセスが終了するかフリーズしてしまうのだ。
11:では、分析6の3つの質問に答えよう。
a: コピー&ペーストは、習慣的にオブジェクトのポインタを持って来るために使用されますが、非常にその正確な意味を理解していない。
b: m_tuがaの要因でヘッダーファイルで人為的に宣言されたと推測。Nk行のコードが1回使われ、宣言には説明のコメントがついていたからです。ははは
c:絶対にない。このビーバータイプのピットは、究極のピットです。

12:実は、徹底されていない小さな問題が2つある
a: getCP()関数を通してm_tuポインタをチューニングするのは正常なのでしょうか?インターネット上の一般的な見解は、それを介してチューニングされるべきではないということです、それは、システムに関連する可能性がありますか?私はlinuxなので、自分で判断するしかないようです。
b: getCP()関数において、if(m_pm == NULL)のコードを直接実行すると、プロセスが終了し、コンソールに「terminate called without an active exception」と表示されます。マクロ定義D_P_P()がif(m_pm == NULL)のコードを実行すると、プロセスがフリーズし、コンソールには「シグナルコントロールを受け取りました」11 と表示されます。同じコード行を関数に直接記述するのと、マクロ定義 (別のファイルにある) を通して取得するのでは、違いがあるようです。
上記2つの小さな問題についてご存知の方がいらっしゃいましたら、ご指導のほど、よろしくお願いいたします。