2013-02-25 48 views
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)行的访问冲突。我试图检查数组是否存在,然后删除它,如果它。

+3

使用RAII所以你没有在第一时间担心这个问题。 – chris 2013-02-25 07:35:23

+1

究竟是什么错误?看起来应该可以正常工作。 – 2013-02-25 07:36:33

+0

错误指向if(m_fileBuffer)行。 Loader.exe中0x00087bbc未处理的异常:0xC0000005:访问冲突读取位置0xccccccf0。 – 2013-02-25 07:40:48

回答

1

记得初始化你的数组指针为NULL。否则,该值是未定义的,并且检查可能不起作用。

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

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

+1

“m_fileBuffer = 0;” – 2013-02-25 07:38:04

+0

删除后为+1,但初始化语句是不必要的。 – 2013-02-25 07:39:32

+0

对不起,我错过了将指针设置为0 - 我认为这是不好的做法。这是误导。 – Dariusz 2013-02-25 07:41:17

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; 
} 
+2

不错,但'0 Dariusz 2013-02-25 07:45:31

+0

代码永远不会到达文件大小部分,因为找不到文件。所以m_fileBuffer保持为空。 – 2013-02-25 07:47:10

相关问题