2

QStringメンバーが必要なカスタム例外を開発しています。何かのようなもの:

class MyException
{
private:
    const QString fDescription;

public:
    MyException(QString desc);
};

MyException::MyException(QString desc) : fDescription(desc)
{}

使用しようとすると:

if (isErrorEncountered)
{
    MyException e(QString("Descriptive message here..."));
    throw e;
}

セグメンテーション違反が発生します。症状は、ここで説明されているものと似ています: Qt QString cloning Segmentation Fault

SIGSEGV は から始まりQBasicAtomicInt::ref、 から来QString::QString(const QString &other)ます。

コピー コンストラクター内で無効な QString をコピーしようとしているように思えます。それへの有効な参照がある限り、QString はそのコンテンツへのポインタを保持することが私の理解です。MyException インスタンスのコピーが作成されている場合、一時的なスタック インスタンスがスコープを離れておらず、コピーが成功するというのは本当ではないでしょうか?

QString メンバーなしで実装MyExceptionすると、すべてがうまく機能します。

4

1 に答える 1

1

質問に対する答えは、「はい、QString は安全に例外のメンバーになることができます」です。

私が遭遇した問題は、 のデータ ソースとして機能するオブジェクトにfDescriptionバグがあったことが原因でした。getter メソッドを実装しました。

class Source
{
private: QString fData;
public:  QString GetData(void) { this->fData; }   // There is a missing return
}

もちろん、この呼び出しの結果は、その時点でスタックに存在するランダムな値であり、したがって SIGSEGV です。

QString は期待どおりに動作し、それへの有効な参照があれば、例外で問題なく使用できます。

SIGSEGV が発生した正確なポイントはtry、例外のコピーが構築されているブロックのスコープを離れていました (覚えておいてください: 値によるスロー、参照によるキャッチ)。デフォルトのコピー コンストラクターは、すべてのメンバーの浅いコピーを作成しようとし、無効な QString 参照へのアクセスに失敗します。

于 2012-05-29T11:52:56.993 に答える