61217


現在、RAD Studio 10.3でプログラミングを行っています。  
プログラムをデバッグ機能を実行中。必ず次のプログラムで”デバッガ例外通知”というのが出てきてしまい、デバッグ実行が続行できなくなってしまいます。

[code]

    void __fastcall TfrmMain::ServerConnect(TIdContext *AContext)
    {
    ------------(中略)---------------------
        if(m_pDevList->Count >= 999){
    ------------(中略)---------------------
    }
    
[/code]

このm_pDevListという変数はMain.hファイルでこのように宣言されています。

[code]

    class TfrmMain : public TForm
    {
    ------------(中略)---------------------
    private:    // ユーザー宣言
        TList * m_pDevList;
    ------------(中略)---------------------
    }
    
[/code]

このm_pDevListというポインタ変数は、デバッグが停止した際にNULLの状態となっていることを確認しました。このNULLの状態だとif文などでアクセスした場合ダメなのでしょうか？  
m_pDevList->Countには”0”としておかないといけないということでしょうか？

このエラーの回避方法を教えて下さい。


CC BY-SA 4.0
2019-12-07T10:38:22.170
61212
2019-12-07T12:54:10.147
35993
question
c++
デバッガ例外通知がでてデバッガ続行が不能になる。リスト変数がNULLだから？


`m_pDevList`はポインタ変数ですので、`NULL`の場合、`->`によるメンバ変数の参照はできません。  
プログラムは、そのため、異常終了しようとしてデバッガで捕捉されているように見受けます。

＃`NULL`は実体を指していない、の意味です。

これ自体がエラーですので、`m_pDevList`に正しい値を指定することで、事象は解消するはずです。  
例えば、実体が定義されている場合、そのポインタで初期化すればよいでしょう。

[code]

    class TfrmMain : public TForm
    {
    private:
        TList * m_pDevList;
        TList m_devList;
    
    public:
        // コンストラクタ
        TfrmMain() : TForm()
        {
            // 例: m_pDevListをm_devListを指すように初期化
            m_pDevList = &m_devList;
        }
    }
    
[/code]

あるいは、動的に確保する方法もあります。

[code]

    class TfrmMain : public TForm
    {
    private:
        TList * m_pDevList;
    
    public:
        // コンストラクタ
        TfrmMain() : TForm()
        {
            // 動的に確保した領域を指すように初期化
            m_pDevList = new TList;
        }
        // デストラクタ
        ~TfrmMain()
        {
            // ※動的に確保した領域は解放する必要がある
            delete m_pDevList;
        }
    }
    
[/code]


CC BY-SA 4.0
2019-12-07T12:54:10.147
61217
2019-12-07T12:54:10.147
20098
61212
answer