1

次のコードは、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。何か案は?

4

1 に答える 1

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

これは何も返さないため、未定義の動作を引き起こします。また、名前空間レベル (";") での空の宣言は完全に不要です (古い C++ 標準では違法でした)。

于 2014-08-04T11:28:38.503 に答える