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