所以我有一個在緩衝區分配的緩衝區的文件的大小與我的記憶怎麼了?
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之外複製字節,現在我期望那些被我的結構解構器清理掉,但是在我期望或者某些內存仍然存在之前,指向原來的子緩衝區,如果我讓子緩衝區泄漏,我得到我期望的數據,但這不是一個解決方案。
'char * bcpy = new char [size]; memcpy(bcpy,(buffer + cursor),size + 2);'Ouch? –
問題是C++。所以**爲什麼**你使用手動內存管理而不是智能指針和'char *'而不是'std :: string'? – Grizzly
這個目標是在處理寬帶時交換endian-ness –