0
重構使用stringstreams的我被賦予這樣的代碼:用的memcpy
class Record
{
private:
unsigned short size_of_buffer;
char* buffer;
public:
bool was_marked_as_deleted();
};
bool Record::was_marked_as_deleted(){
if (buffer == NULL)
return false;
stringstream stream;
stream.write(buffer,size_of_buffer);
stream.seekg(0,stream.beg);
unsigned short size_of_first_field = 0;
stream.read((char*)(&size_of_first_field) , sizeof(size_of_first_field));
if (size_of_first_field > 1)
return false;
char first_field = 1;
stream.read((char*)(&first_field) , sizeof(first_field));
if (first_field != MARK_DELETED)
return false;
return true;
}
上述功能是
- 非常低效的,這是因爲
stream.write(buffer,size_of_buffer);
線的 - 不可讀。
所以我想用memcpy
而不是stringstreams
來重構它。 這是我想出了:
bool Record::was_marked_as_deleted(){
if(buffer==NULL)
return false;
unsigned short size_of_first_field= 0;
memcpy(&size_of_first_field,buffer,sizeof(size_of_first_field));
if (size_of_first_field > 1)
return false;
char first_field = 1;
//This line produces valgrind error
//EDIT: fixed it with the following IF statement
if (size_of_buffer > sizeof(size_of_first_field))
memcpy(&first_field,buffer+sizeof(size_of_first_field),sizeof(first_field));
if (first_field != MARK_DELETED)
return false;
return true;
}
現在的問題是,我的程序運行正常,但是當我valgrind
運行它,我得到這個:
==17340== Invalid read of size 1
==17340== at 0x8059452: Record::was_marked_as_deleted() (Record.cpp:161)
==17340== Address 0x5af2832 is 0 bytes after a block of size 2 alloc'd
這是爲什麼?爲什麼我的程序在valgrind下失敗,而不是正常執行?
爲什麼這麼說stream.write是非常低效的?它甚至沒有對輸入進行任何檢查。這是否被實時調用?或者是一個非常大的時間?如果不是這樣,你可能不會注意到它的差別 – Pedrom
它被稱爲很多次。函數不會將'buffer'的內容複製到流中? –
就像memcpy一樣,你不會看到區別。檢查一下Obvlious隊長說什麼是我準備給你的答案。 – Pedrom