在删除数组之前,如何检查以确保已分配数组

时间:2013-02-25 07:33:52

标签: c++ arrays

我根据我读取的文件大小创建一个字符数组。如果找不到该文件,则不会创建该数组。当我调用我的析构函数时,我得到一个错误,我认为它告诉我指针无效,因为找不到文件。我想要做的只是检查该类是否已正确加载到缓冲区中的文件中。我可以添加一个成功标志并在析构函数中检查它,但我认为有更好的方法。

在课程标题中:

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)行时遇到访问冲突。我试图检查数组是否存在,然后删除它,如果它存在。

2 个答案:

答案 0 :(得分:1)

请记住将数组指针初始化为NULL。否则,该值未定义,检查可能无效。

请记住在删除数组后将指针设置为NULL。否则if检查将再次通过,您将收到分段错误。

您可能会收到编译器的警告。如果您使用过valgrind,那么肯定会收到关于检查单位值的警告。

答案 1 :(得分: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;
}