9

このプログラム (より大きなプログラムから絞り込まれています) は、Windows 7 で vs2008 Release(Win32) モードでコンパイルした後、常にクラッシュします。またはboost::asio::buffers_iterator。Ubuntu で g++ を使用して問題なくコンパイルおよび実行できます。

人々はそれがコンパイラのバグである可能性は非常に低いと言っていましたが、デバッグ モードでコンパイルすると (または最適化を無効にすると)、問題はなくなります。

私はかなりの時間この問題に悩まされてきました。どんな助けでも大歓迎です。前もって感謝します。

#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;
}
4

2 に答える 2

1

編集:コードを読み間違えました、ごめんなさい。

カーソルと終了イテレータが無効なメモリを指しています。出力イテレータへのコピー中に再割り当てされた基になるstreambufを変更しました。asio streambufを使用すると、パフォーマンス上の理由からrawメモリにアクセスできますが、注意点として、このようなことについて心配する必要があります。

デバッグとリリースにより、割り当てられたブロックの基本的なサイズ、およびメモリのフェンス、ガード、初期化、整列などに関する割り当てと割り当て解除の動作が変更されます。

問題を修正するには、コピー操作の後にイテレータを作成します。

于 2012-11-11T20:12:20.560 に答える
1

「range_t r(cursor, end)」は文字の範囲ではなく「バッファ」の範囲であるため、機能しません。したがって、バッファ ポインタのリストを LINE_END_MARK の各文字と比較しています。

win32 の下でリリース モードでクラッシュする場合、Windows ではヌル ポインターを逆参照してクラッシュを引き起こすためです。

boost asio には複数のバッファという概念がありますが、現在は実際には使用されていません。基本的に1つのバッファのリストである「const_buffers_1」または「mutable_buffers_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;
于 2012-11-12T10:21:08.793 に答える