2010-09-29 61 views
1

我遇到了stringstream對象的問題。我的班級有一個輸入流作爲成員。 我正在檢查如果obj-> istream並在那之後如果obj-> istream-> good()。爲什麼通過指針調用std :: stringstream的good()導致崩潰?

流存在,但調用good()會崩潰。我在Visual Studio 2005中。任何線索?

如何重置istream?


if (soap->is) { 

    if (soap->is->good()) 

     return soap->is->read(s, (std::streamsize)n).gcount(); 

    return 0; 
} 

該代碼是從gSOAP的框架


std::istringstream in_stream; 
in_stream.str("a buffer"); 
soap->is = &in_stream; 

的in_stream超出範圍,它屬於一個局部堆棧,然而 - >是 - >良好() 稱爲該函數之外當in_stream不再存在時。

+1

你能發佈實際的代碼嗎? – shuttle87 2010-09-29 17:08:14

+2

你在等同於打電話給醫生,告訴他你受傷了,但不是在哪裏,如何,或者爲什麼你認爲你可能會受傷。代碼在哪裏? – identity 2010-09-29 17:08:58

+0

istream是一個指針嗎? – 2010-09-29 17:10:22

回答

3

這可能表示您的is成員不指向stringstream。當封閉對象被實例化時,它可能僅僅被初始化爲一些垃圾值。

如果您正在測試指針爲零,請確保它在構造函數中設置爲零(如果您已經分離流,則將其重置爲零)。

+0

+1指出缺乏初始化 - 這是最有可能的原因。 – 2010-09-29 17:24:20

1

你的程序中有其他地方有未定義的行爲 - 我的猜測是你實際上將該指針轉換爲std::istream,即使它不是。我們需要看到in在能夠正確運行的情況下被實例化。在代碼庫中查找任何代碼到istream,我敢打賭你會發現問題。

4

您已經在最後兩行中回答了問題。你有一個指向一個超出範圍的對象的懸掛指針,使用它會導致未定義的行爲(這很可能是崩潰)。只要需要,您需要確保物體存在,方法是將其放置在較長的範圍內,或者使用new進行分配,並確保在不再需要時將其刪除。

+2

如果使用'new'分配,它應該進入某種形式的智能指針,無論是'std :: auto_ptr',還是某種形式的範圍或共享指針。 – 2010-09-29 17:30:40

+1

或者只是通過'.str()'中的值返回一個字符串,因爲所有的OP都使用指針(試圖)從中獲取數據。 – Potatoswatter 2010-09-29 17:36:28