整数のバイナリクラス表現の次の実装について考えてみます。
class Binary {
private:
int *digits;
int first1;
public:
Binary() {
digits = new int[128];
digits[0]=0;
first1=0;
}
~Binary() {
cout<<"deleting"<<endl;
delete [] digits;
}
Binary(const Binary& b){
digits = new int[128];
memcpy(digits,b.digits,128*sizeof(int));
first1=b.first1;
}
explicit Binary(double x){
int n=(int)x,i;
digits = new int[128];
for (i=0; n ; i++,n>>=1) digits[i]=(n & 1)? 1:0;
first1=i-1;
}
Binary& operator =(const Binary& b){
if (this==&b) return *this;
memcpy(digits,b.digits,128*sizeof(int));
first1=b.first1;
return *this;
}
Binary(int n) {
int i;
digits = new int[128];
for (i=0; n ; i++,n>>=1) digits[i]=(n & 1)? 1:0;
first1=i-1;
}
void print() {
for (int i=first1; i>=0 ; i--) cout<<digits[i];
cout<<endl;
}
operator int() {
int x = 1,sum=0;
for (int i=0; i<=first1 ; i++,x<<=1) sum+=digits[i]*x;
return sum;
}
Binary& operator +(Binary& a) {
int overflow = 0;
Binary* b1=new Binary();
int max = a.first1>this->first1? a.first1 : this->first1,bit;
for (int i=0; i<=max ; i++) {
bit=a.digits[i]+this->digits[i]+overflow;
overflow=0;
if (bit>1) overflow=1;
b1->digits[i]=bit%2;
}
return *b1;
}
};
そしてそれを使用する主なもの:
int main() {
Binary b(91);
int x=9;
Binary *b2=new Binary();
*b2=b+x;
x=*b2;
b2->print();
cout<<" = "<<x;
cin>>x;
}
行について話しましょう:
*b2=b+x;
最初に、コンパイラはint xに新しいバイナリインスタンスを暗黙的に割り当て、次にそれを加算のパラメータとして使用し、次に加算結果の新しいバイナリインスタンスを作成して、ビットごとに*b2にコピーします。
問題は、このコードを実行すると、コマンドの実行用に2つのオブジェクトが作成されているのに、1回だけ削除を出力することです。どうやら、追加コードからリークが発生しているようです。このコードでは、結果を返すために新しいオブジェクトを明示的に作成しました。
Q1:私は正しいですか?
Q2:これを克服するために何ができますか?
編集:演算子のオーバーロードのトピックに関する回答と詳細は、ここにあります