使用-O3编译时出现奇怪的段错误
Strange segfault when compiling with -O3
下面的代码可以在Debian 7的g++ 4.7.2-5上正常编译和工作。
#include <iostream>
#include <string.h>
using namespace std;
class mystring {
char * buf;
static char * dupbuf(const char * buf) {
char * result = new char[strlen(buf) + 1];
strcpy(result, buf);
return result;
}
public:
mystring(const char * o)
: buf(dupbuf(o)) {}
~mystring() { delete[] buf; }
mystring(const mystring &) = delete;
mystring & operator=(const mystring&) = delete;
void write(ostream & o) const {
if (!buf) { exit(1); } // remove me
o << buf;
}
};
ostream & operator <<(ostream & o, const mystring & ms) {
ms.write(o);
};
int main() {
mystring m("hello");
cout << m << endl;
return 0;
}
…除非使用-O2或更高版本编译。然后它会出现段错误,valgrind会声明从0x0读取的数据无效。我猜有一些堆栈损坏,但对于我的生命,我找不到它。
有趣的是,删除标记为"remove me"的行会使问题消失。把一个endl
加到write
上也一样。什么好主意吗? ostream & operator <<(ostream & o, const mystring & ms) {
ms.write(o);
};
这会导致未定义的行为,因为它不返回任何东西。此外,名称空间级别的空声明(";")是完全没有必要的(并且在旧的c++标准中是非法的)。
相关文章:
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 如何摆脱C ++中的分段错误错误?
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- 如何解决分段错误错误C++
- 作为参数模板的模板类:MSVC 错误 - 错误 C2977:模板参数过多 (C++98)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 卷曲给出分段错误错误
- 无法访问 Arduino 结构字段。错误"退出状态 1。xxxx 不命名类型"
- 错误错误 C2872:"布尔值":kinect.h 的不明确符号
- C++打印模板容器错误(错误:"运算符<<"的不明确重载)理解?
- 结构的分割错误错误
- 为什么此代码返回分段错误错误?
- 错误错误:无法编译内置功能
- 分段错误错误C++
- C++ 1Z 错误:错误:演绎指南中声明中的显式限定
- 使用对数据类型的向量的哈希表中的分段错误错误
- 为什么此代码会导致分段错误错误
- JNA结构字段值错误
- C++段故障错误