这是编译器的Visual C ++ 2008的Bug

时间:2012-10-31 03:28:17

标签: c++ visual-c++ boost-asio

我正在使用boost asio编写一个简单的memcached客户端,但是,当在Windows 7(64位)的visual c ++ 2008下以发布模式编译时,如果我添加一个无辜的“std :: string s,程序将引发访问冲突异常;”在函数处理程序中。欢迎提出任何建议。

#include <iostream>
#include <boost/asio.hpp>
#include <string>
#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 个答案:

答案 0 :(得分:2)

当您添加“无辜”自动变量时,您正在更改该功能的堆栈帧的布局。发生的事情是,你(总是)腐败的堆栈上的某些变量会被移动。所以,当你以前捣毁一些未经注意的内存位置时,你现在正在捣毁更重要的东西(比如返回地址)。

答案 1 :(得分:0)

正如Matt Ball在评论中提到的,代码中的错误概率比编译器错误的概率大得多,尤其是对于最近的编译器。如果您仍然确信它是编译器错误,您可以通过编译其他编译器(例如gcc或其Windows端口,MinGW)来确认您的怀疑。