使用-O3编译时出现奇怪的段错误

时间:2014-08-04 11:15:38

标签: c++ gcc gcc4.7

以下代码在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或以上编译。然后是segfaults,valgrind声称从0x0读取无效。我猜测有一些堆栈损坏,但对于我的生活,我无法找到它。

有趣的是,删除标记为&#34的行;删除我&#34;使问题消失。将endl添加到write也是如此。有什么想法吗?

1 个答案:

答案 0 :(得分:9)

ostream & operator <<(ostream & o, const mystring & ms) {
  ms.write(o);
};

这会导致未定义的行为,因为它不会返回任何内容。此外,命名空间级别(&#34 ;;&#34;)的空声明是完全没有必要的(并且在旧的C ++标准中用于非法)。