これは、C++演算子のオーバーロードを調べるためにコーディングした素朴な例です。私がそれを実行すると、コードは文c = a + bでハングします。コントロールが決して届かないc.display();
なぜこのコードが上記の場所でハングしますか?
cout << ptr << '\n';
を代入演算子のオーバーロードされた関数に置くと、デバッグの一部として、HelloWorldが出力されるため、stringは不正な形式ではないようです。
なぜそれがハングするのですか?私は何が欠けているのですか?
class mystring
{
char *ptr;
public:
mystring(char *str = "")
{
ptr = new char[strlen(str) + 1];
strcpy(ptr,str);
}
mystring operator +(mystring s)
{
char *str = new char[strlen(ptr) + strlen(s.ptr) + 1];//where should this memory be freed
strcpy(str,ptr);
strcat(str,s.ptr);
return mystring(str);
}
void operator =(mystring s)
{
strcpy(ptr,s.ptr);
//cout << ptr << '\n'; \\Debug - this prints out HelloWorld but still hangs
}
void display()
{
cout << ptr << '\n';
}
~mystring()
{
delete [] ptr;
}
};
int main()
{
mystring a="Hello",b="World",c;
c = a + b;
c.display();
getchar();
}
EDIT:コンパイラ:MS-のVisual C++ 2010 Expressの/ Windowsの。
'演算子= 'はメモリを割り当てません。 'operator +'は2回の割り当てを行います。 –
また、適切なコピーコンストラクタを実装する必要があることを追加したいと思います。 – Nim
valgrindなどのメモリプロファイラは、この種のメモリエラーを検出したでしょう。 – Francois