2012-10-31 65 views
8

這個程序(從較大的程序中縮小)在Windows 7下以vs2008 Release(Win32)模式編譯後總是崩潰。我不熟悉彙編代碼,也不知道它是編譯器還是boost的缺陷: :ends_with或boost :: asio :: buffers_iterator。它可以在Ubuntu中使用g ++進行編譯和執行,沒有任何問題。人們說它不太可能是編譯器的bug,但是當在調試模式下編譯(或禁用優化)時,問題確實消失。編譯器或boost庫的問題?

我被這個問題困住了好幾個小時。任何幫助表示讚賞。提前致謝。

#include <iostream> 
#include <string> 
#include <boost/asio.hpp> 
#include <boost/algorithm/string.hpp> 

typedef boost::asio::buffers_iterator<boost::asio::const_buffers_1> iterator_t; 
typedef boost::iterator_range<iterator_t> range_t; 
static const std::string LINE_END_MARK = "\r\n"; 

int main(int argc, char* argv[]) 
{ 
    boost::asio::streambuf _buf; 
    std::ostream os(&_buf); 
    os<<"END\r\n"; 

    iterator_t cursor = boost::asio::buffers_begin(_buf.data()); 
    iterator_t end = boost::asio::buffers_end(_buf.data()); 

    std::ostream_iterator<char> it(std::cout," "); 
    std::copy(LINE_END_MARK.begin(), LINE_END_MARK.end(), it); 

    range_t r(cursor, end); 
    if(!boost::ends_with(r, LINE_END_MARK)) 
     return 0; 
    return 1; 
} 
+2

我不知道回答你的問題,但我可以用瑞普VS2008你的崩潰,但不與VS2010。 –

+0

你編譯Boost ASIO嗎?我認爲這是少數需要編譯的東西之一 – pyCthon

+2

asio是一個僅包含頭文件的庫,但它依賴於boost :: system,它需要單獨的編譯。 – user869210

回答

1

編輯:我誤讀了代碼,對不起。

您的光標和結束迭代器指向無效內存。您修改了在複製期間重新分配給輸出迭代器的基礎streambuf。 asio streambuf可以讓你訪問原始的內存,但是需要注意的是你不得不擔心這樣的事情。

調試和發佈將改變分配方式和釋放與問候分配塊的基本尺寸,以及如何存儲器可以圍欄,防護,初始化,對齊行爲等

副本後建設的迭代器操作來解決你的問題。

+0

我不知道我關注 - 輸出迭代器的'std :: copy()'操作發生在'std :: cout'。 'asio :: streambuf'與'os'不是'cout'關聯。寫入'cout'不應該影響'os'。 –

+0

你當然是對的;我誤解了這一點。我感到困惑,將不得不作出進一步的考慮。至少不會是asio streambuf中的第一個bug。 – adzm

1

它不起作用,因爲'range_t r(遊標,結束)'是一個「緩衝區」的範圍,而不是一系列字符。因此,您正在比較LINE_END_MARK中每個字符的緩衝區指針列表。

如果在win32下發布模式下崩潰,因爲在Windows中,您最終會失去引用導致崩潰的空指針。

boost asio有這個多緩衝區的概念,但目前它並沒有真正使用。如果你只看真正使用'const_buffers_1'或'mutable_buffers_1'這個基本上是1個緩衝區列表的實現。

我假設你想比較緩衝區的內容,而不是緩衝區範圍的列表。

所以,你想要做的事,如:

typedef boost::iterator_range<const char*> range_t; 
range_t r(boost::asio::buffer_cast<const char*>(_buf.data()), boost::asio::buffer_cast<const char*>(_buf.data()) + boost::asio::buffer_size(_buf.data())); 
if(!boost::ends_with(r, LINE_END_MARK)) 
    return 0; 
return 1; 
+0

也得出同樣的結論。多個緩衝區支持有時會有點混亂。 – adzm

+0

@Shane Powell我不同意。從asio的文檔中,buffers_begin將迭代器返回給數據而不是緩衝區序列。 http://www.boost.org/doc/libs/1_53_0/doc/html/booster_asio/overview/core/buffers.html buffers_iterator <>類模板允許遍歷緩衝區序列(即滿足MutableBufferSequence或ConstBufferSequence要求的類型)就好像它們是連續的字節序列一樣。 – user869210