如何在删除数组之前检查数组是否已分配
我正在根据读取的文件大小创建一个字符数组。如果找不到该文件,则不会创建该数组。当我打电话给我的析构函数时,我收到一个错误,我想这是告诉我指针是无效的,因为找不到文件。我想要做的只是检查该类是否已正确加载到缓冲区中。我可以添加一个成功标志并在析构函数中检查它,但我认为有更好的方法。如何在删除数组之前检查数组是否已分配
在类的头:
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)
行的访问冲突。我试图检查数组是否存在,然后删除它,如果它。
记得初始化你的数组指针为NULL。否则,该值是未定义的,并且检查可能不起作用。
请记住在删除数组后将您的指针设置为NULL。否则,if检查将再次通过,您将收到分段错误。
您可能会收到编译器的警告。如果您使用过valgrind
,您肯定会收到有关检查单位值的警告。
“m_fileBuffer = 0;” – 2013-02-25 07:38:04
删除后为+1,但初始化语句是不必要的。 – 2013-02-25 07:39:32
对不起,我错过了将指针设置为0 - 我认为这是不好的做法。这是误导。 – Dariusz 2013-02-25 07:41:17
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;
}
不错,但'0
代码永远不会到达文件大小部分,因为找不到文件。所以m_fileBuffer保持为空。 – 2013-02-25 07:47:10
使用RAII所以你没有在第一时间担心这个问题。 – chris 2013-02-25 07:35:23
究竟是什么错误?看起来应该可以正常工作。 – 2013-02-25 07:36:33
错误指向if(m_fileBuffer)行。 Loader.exe中0x00087bbc未处理的异常:0xC0000005:访问冲突读取位置0xccccccf0。 – 2013-02-25 07:40:48