Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是Visual C++ 2008的编译器缺陷吗? 我使用Boost ASIO编写一个简单的MycCask客户端,但是,当在Windows 764位的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; }_C++_Visual C++_Boost Asio - Fatal编程技术网

这是Visual C++ 2008的编译器缺陷吗? 我使用Boost ASIO编写一个简单的MycCask客户端,但是,当在Windows 764位的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; }

这是Visual C++ 2008的编译器缺陷吗? 我使用Boost ASIO编写一个简单的MycCask客户端,但是,当在Windows 764位的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; },c++,visual-c++,boost-asio,C++,Visual C++,Boost Asio,正如Matt Ball在评论中提到的,代码中出现错误的概率远远大于编译器出现错误的概率,尤其是对于最近的编译器。如果您仍然确信这是一个编译器错误,您可以通过使用另一个编译器(如gcc或其Windows端口MinGW)进行编译来确认您的怀疑。添加该无辜的自动变量时,您正在更改该函数堆栈帧的布局。发生的情况是,堆栈上的某个变量总是被破坏,因此会被移动。因此,当您以前破坏一些未被注意到的内存位置时,您现在正在破坏一些更重要的内容,如返回地址。代码中的错误概率>>>编译器中的错误概率。如果这是一个编译器

正如Matt Ball在评论中提到的,代码中出现错误的概率远远大于编译器出现错误的概率,尤其是对于最近的编译器。如果您仍然确信这是一个编译器错误,您可以通过使用另一个编译器(如gcc或其Windows端口MinGW)进行编译来确认您的怀疑。

添加该无辜的自动变量时,您正在更改该函数堆栈帧的布局。发生的情况是,堆栈上的某个变量总是被破坏,因此会被移动。因此,当您以前破坏一些未被注意到的内存位置时,您现在正在破坏一些更重要的内容,如返回地址。

代码中的错误概率>>>编译器中的错误概率。如果这是一个编译器错误,让我们面对它,与你的代码相比,几率很低,把它缩小到一个最小的例子,提交一个错误报告试试不同的IDE,看看你是否遇到了问题,很可能是你的代码。当然,如果冲突的原因是UB,那么它可能在另一个编译器上工作。@EdS:不过,打开编译器警告可能有助于找到它。你找到bug了吗?UB=未定义的行为。顺便说一句,您的代码仍然有一个问题,即使在g++下编译时它并不明显。试试g++-Wall,看看它是否会给你一些有用的警告。在引发异常之前,实际上不会执行大的while循环,但是如果我对while循环进行注释,它将按预期工作。何时执行并不重要。编译期间收集所有本地/自动/堆栈变量,并在堆栈框架中分配所有变量。如果注释掉while循环,则注释掉了函数的所有实际功能!这并不奇怪,它的工作,然后。