2013-02-25 51 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

相關問題