编译器或升级库的错误?

use*_*210 9 c++ boost boost-asio visual-c++

在Windows 7下的vs2008 Release(Win32)模式下编译后,这个程序(它已经从较大的程序缩小)总是崩溃.我不熟悉汇编代码,不知道它是编译器或boost :: ends_with的错误或者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;
}
Run Code Online (Sandbox Code Playgroud)

adz*_*dzm 1

编辑:我误读了代码,抱歉。

您的光标和结束迭代器指向无效内存。您修改了在复制到输出迭代器期间重新分配的基础streambuf。出于性能原因,asio Streambuf 允许您访问原始内存,但需要注意的是您必须担心这样的事情。

调试和释放将改变分配和释放的行为方式,涉及分配块的底层大小以及内存如何被隔离、保护、初始化、对齐等。

在复制操作后构造迭代器来解决您的问题。