我目前正在調試一個相當大的程序。當我來到下面的代碼行時:字符串故障
value->binary_string = value_it->binary_string.substr(range->msb->value, range->size);
該程序行爲不正確。這裏value是一個指向具有類型爲std :: string的成員名爲binary_string的結構體的指針。當我到達這條線在調試時,我看到:
value_it->binary_string = "00000000000000000000000000000111"
range->msb->value = 0
range->size = 32
後這行代碼執行時,值 - > binary_string是空的!我甚至已經改變了行
value->binary_string = value_it->binary_string
,它仍然失敗!
當我在調試時到達這條線時,我的程序使用了大約100 Mb的內存,所以我不認爲這是內存問題(儘管我正在運行Valgrind,因爲我們正在驗證這一點)。我使用Ubuntu 11.10,g ++ - 4.6和libstdC++ 6。
有沒有人遇到過這樣的事情?我不知道爲什麼我的琴絃不工作!
感謝,
山姆
EDIT1:
類型的值NumberInst,定義如下:
typedef std::string String;
struct NumberInst
{
unsigned size;
bool signed_;
String binary_string;
bool valid;
unsigned value;
NumberInst();
};
EDIT2:
它看起來像我已經一點點縮小搜索範圍。在調試時,我嘗試了幾條打印命令:
print value_it->binary_string
"00000000000000000000000000000111"
print value_it->binary_string[31]
'1'
print value_it->binary_string.substr(0, String::npos)
""
print value_it->binary_string.substr(0, 1)
""
看來substr在這種情況下工作不正常。但是,當我在主函數中測試substr時,它似乎工作正常。
您驗證了'value'分配正確(並且沒有被釋放)嗎? – Yaniro 2012-03-01 21:35:08
@Yaniro我剛查過。新的調用就在這行代碼之前,當我進入新的調用時,我到達構造函數的值。另外,我測試了一個push_back的調用,這似乎正常工作。 – 2012-03-01 21:41:12
看看這個副本寫的東西:http://en.wikipedia.org/wiki/Copy-on-write ...它可能是兩個字符串使用相同的緩衝區,直到你改變其中一個,如果我理解正確... – Yaniro 2012-03-01 21:47:51