0

読み取ったファイルのサイズに基づいて文字配列を作成しています。ファイルが見つからない場合、アレイは作成されません。デストラクタを呼び出すと、ファイルが見つからないためポインタが無効であることを示していると思われるエラーが表示されます。私がやりたいことは、クラスがファイルに正しくバッファにロードされているかどうかを確認することだけです。成功フラグを追加してデストラクタでチェックすることもできますが、もっと良い方法があると思います。

クラスヘッダーで:

uint32          m_fileSize;
char*           m_fileBuffer;

コンストラクターで:

m_fileSize = 0;
m_fileBuffer = 0;

初期化関数では:

std::ifstream file(filename.c_str(), std::ios::in|std::ios::binary|std::ios::ate);

if (file.is_open())
{
    m_fileSize = (int)file.tellg();
    m_fileBuffer = new char[m_fileSize];
    file.seekg (0, std::ios::beg);
    file.read (m_fileBuffer, m_fileSize);
}
else
{
    return false;
}

デストラクタで:

    if(m_fileBuffer)
    {
        delete [] m_fileBuffer;
    }

要約すると、ファイルが存在して読み込まれると、うまく機能します。そこにない場合、if(m_fileBuffer)行を読んでアクセス違反が発生します。配列が存在するかどうかを確認し、存在する場合は削除しようとしています。

4

2 に答える 2

1

配列ポインタを NULL に初期化することを忘れないでください。そうしないと、値が未定義になり、チェックが機能しない可能性があります。

配列を削除した後は、ポインターを NULL に設定することを忘れないでください。そうしないと、if チェックが再びパスし、セグメンテーション違反が発生します。

コンパイラから警告が表示される場合があります。また、使用していた場合valgrindは、初期化された値のチェックに関する警告が確実に表示されます。

于 2013-02-25T07:37:32.970 に答える
1
if (file.is_open())
{
    m_fileSize = (int)file.tellg();

    if(0 < m_fileSize)
        m_fileBuffer = new char[m_fileSize];
    .....
    .....
}

デストラクタで:

if(m_fileSize && m_fileBuffer)
{
    delete [] m_fileBuffer;
}
于 2013-02-25T07:40:19.407 に答える