2012-10-08 134 views
0

所以我有一個在緩衝區分配的緩衝區的文件的大小與我的記憶怎麼了?

char *buffer = new char[size_of_file];

i循環和一些指針複製到一個子緩衝器與它較小的單位工作的功能。

char *subbuffer = new char[size+1];

for (int i =0; i < size; i++) { 
    subbuffer[i] = (buffer + cursor)[i]; 
} 

下一I調用一個函數,並將它傳遞這個子緩衝器,和任意光標在子緩衝器的位置,並且被抽象文本的大小。

wchar_t* FileReader::getStringForSizeAndCursor(int32_t size, int cursor, char *buffer) { 

    int wlen = size/2; 

    #if MARKUP_SIZEOFWCHAR == 4 // sizeof(wchar_t) == 4 
    uint32_t *dest = new uint32_t[wlen+1]; 
    #else 
    uint16_t *dest = new uint16_t[wlen+1]; 
    #endif 

    char *bcpy = new char[size]; 
    memcpy(bcpy, (buffer + cursor), size+2); 



    unsigned char *ptr = (unsigned char *)bcpy; //need to be careful not to read outside the buffer 


    for(int i=0; i<wlen; i++) { 
     dest[i] = (ptr[0] << 8) + ptr[1]; 
     ptr += 2; 
    } 
    //cout << "size:: " << size << " wlen:: " << wlen << " c:: " << c << "\n"; 

    dest[wlen] = ('\0' << 8) + '\0'; 
    return (wchar_t *)dest; 
} 

我的價值爲結構的屬性與此存儲,同時通過文件循環

我的問題似乎是,當我自由個子緩衝器,並開始遍歷閱讀我的結構的標題屬性一個結構指針數組,我的應用程序段錯誤。 GDB告訴我它通常完成壽,但我cout缺失的一堆記錄。我懷疑,這與某些功能範圍有關。我認爲getStringForSizeAndCursor中的memcpy會修復segfault,因爲它在我釋放之前在subbuffer之外複製字節,現在我期望那些被我的結構解構器清理掉,但是在我期望或者某些內存仍然存在之前,指向原來的子緩衝區,如果我讓子緩衝區泄漏,我得到我期望的數據,但這不是一個解決方案。

+6

'char * bcpy = new char [size]; memcpy(bcpy,(buffer + cursor),size + 2);'Ouch? –

+2

問題是C++。所以**爲什麼**你使用手動內存管理而不是智能指針和'char *'而不是'std :: string'? – Grizzly

+0

這個目標是在處理寬帶時交換endian-ness –

回答

0

唯一確有錯誤的,我可以在你的問題的代碼,看到的是bcpy的過小的分配,在那裏你分配大小size的緩衝和size+2字節迅速複製到緩衝區中。由於您沒有在代碼中使用額外的2個字節,只需將+2放入副本即可。

除此之外,我只能看到一件可疑的事情,你在做;

char *subbuffer = new char[size+1]; 

和複製size字節的緩衝區。分配提示你爲零終止分配額外的內存,但它不應該在那裏存在(不+1),或者你應該分配2個字節(因爲你的函數提示一個雙字節字符集)。無論哪種方式,我不能看到你零終止它,所以使用它作爲零終止字符串可能會破壞。

@評論中的網格也有一點,分配和處理內存的字符串和wstrings可能是你的東西可以「卸載」到STL,效果很好。

+0

是的,你是正確的,我的配置和cpy被交換了,謝謝!我正在撕掉我的頭髮。 –

+0

這是一個實驗,瞭解內存管理如何在較低級別上工作,所以感謝您處理我在C++中使用如此多C風格的垃圾。我可能應該已經開始使用C,而不是這個hacky的東西。但我到了那裏,非常感謝。 –