

例外処理をした後プログラムが停止してしまいます。

具体的には `try{}catch{}` で何も入っていない連結リスト（連結リストのヘッド、先頭が `nullptr`
を指している状態）から先頭に入っている値を取ろうとした場合を想定した例外処理でして、そこでプログラムが正常に終わるはずだったのですが、以下のメッセージがスクリーンに表示されプログラムが停止してしまいます。

[code]

    lab9.exeは動作を停止しました。問題が発生したため、プログラムが正しく動作しなくなりました。
    プログラムは閉じられ、解決策がある場合はWindowsから通知されます。
    
[/code]

いつもなら、指示を完了した後（今回の場合「List error saying no link in the list」を表示する指示）、「Process
finished with exit code 0」と表示されプログラムが終了するのですが、このプログラムは「Process finished with
exit code 0」が表示されずに停止してしまいます。  
これは例外処理でしてもこうなってしまうものなのでしょうか。

### 現状のソースコード

List.h

[code]

    #ifndef LAB9_LIST_H
    #define LAB9_LIST_H
    
    #include <string>
    #include<exception>
    using std::string;
    
    class list_error : public std::exception{
    private:
        string errorMessage;
    public:
        list_error(string errorMessage = "") : errorMessage(errorMessage){}
        virtual ~list_error(){}
        virtual const char* what() const noexcept override
        {
            return errorMessage.c_str();
        }
    
    };
    
    template <typename T>
    class Link
    {
    private:
        T value;
        Link* next;
    public:
        //constructor
        Link(T value, Link* next = nullptr): value(value), next(next){}
        //destructor
        virtual ~Link(){}
        //return value
        T getValue() const {return this->value;}
        //return next
        Link* getNext() const{return this->next;}
        //set next
        void setNext(Link* next){this->next = next;}
    };
    
    
    
    template <typename T>
    class List
    {
    private:
        Link<T>* head;
    
    
    public:
        List():head(nullptr){}
    
    
        T getHead()
        {
            //throw exception
            if(head == nullptr)
            {
                throw list_error("no link in the list");
            }
            return head->getValue();
        }
    }
    
[/code]

main.cpp

[code]

    #include <iostream>
    #include "List.h"
    
    using std::cout;
    using std::endl;
    
    
    int main()
    {
    
        List<int> intList;
    
        // testing Exception
        try{
            cout << intList.getHead() << endl;
            cout << "Should have thrown an exception." << endl;
        }
        catch(list_error &ex){
            cout << "List error saying " << ex.what() << endl;
        }
        catch( ... ) {
            cout << "Caught something else" << endl;
        }
    
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2021-05-30T02:30:41.607
76189
2021-06-28T06:31:59.303
2021-06-28T06:31:59.303
3060
45177
question
c++
例外処理をした後プログラムが停止してしまう


質問されてからしばらく経っているので、もうどうでもよくなってるかも知れませんが。

だいたい動きそうに見えますが、list_errorのコンストラクタ引数 errorMessage がメンバ変数 errorMessage
と全く同じなのが気になります。

もしも、errorMessage(errorMessage)
という書き方で、メンバ変数のコピーコンストラクタが呼ばれ、その引数に、メンバ変数自体が渡された場合、未初期化のstringオブジェクトをコピー元としてコピーコンストラクト処理を試み、その途中で不正番地参照か何かを起こしてずっこけることは考えられると思います。

コンストラクタ引数の名前をメンバ変数とずらしてみてはいかがでしょう。

コンストラクタ引数として、メンバ変数と同名のものを渡したくなるのは、よくあることなので、メンバ変数またはコンストラクタ引数のどちらかに、目印となるようなプレフィクスないしサフィックスをつけることが、C++では昔からよくやられると思います。例えば、メンバ変数の末尾に
"_" をつけるルールとする、とかです。


CC BY-SA 4.0
2021-06-28T06:16:33.453
77832
2021-06-28T06:16:33.453
40200
76189
answer