• ベストアンサー

クラス内にnewで形成した配列等が含まれる場合

クラスを関数内に作成した時にそれを実体コピーさせるreturnで返したいんですが、class内newで形成した動的配列があるため、返した後デストラクタが呼ばれるので動的配列の中身が消滅してしまう(させている)のですが、動的配列の消去にデストラクタを使用しないようにするしかありませんか? class a{ public: int *b; a(){b=new int[10];} ~a(){delete b;} //エラー原因 a operator+(a &s){a c;c.b[0] = b[0] + s.b[0];return c;} }; void main() {a x,y;y = x + x;}

質問者が選んだベストアンサー

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

コピーコンストラクタ a(const a& s) { b=new int[10]; std::copy(s.b, s.b+10, b); } みたいなのを作ってコピーできるようにしとけばいいでしょう。 関数呼ぶたびにコピーが発生するので、効率よくないですけど。 まあ最近は、効率は気にしないという作り方もありだと思います。 ちなみに、参照を使って、 operator+(a &s) 定義しているときの x + x; は、場合によっては危険(思ったように動かない)ですよ。 考えれば当たり前のことですけど、operator+(a &s)の中で、自分を変更すると、引数としてきたものも一緒に壊していくことになりますから。 今回の関数については大丈夫でしょうけど。

msms001999
質問者

お礼

ご回答ありがとうございます。 コピーコンストラクタを使用してみます。 下記の処理は関数内部で書き換えが発生しないように気をつけます。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

まちがえた. 「operator new[] を使って確保するなら operator delete[] で解放する」です. operator [] で確保って, そんなわけはない>自分.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

・コピーコンストラクタを作る ・std::vector を使う くらいは思いつく. なお, operator [] を使って確保するなら, 消すときも operator delete[] を使ってやってください.

msms001999
質問者

お礼

operatorにnewとdeleteがあったのは知りませんでした。ありがとうございます。

回答No.3

class a{ public: int *b; a(){b=new int[10];} a( const a& s ){ b=new int[10]; for( int i=0;i<10;++i ) b[i]=s.b[i]; } ~a(){delete b;} a& operator=(const a &s) { if( b!=s.b ) for( int i=0;i<10;++i ) b[i]=s.b[i];return *this; } a& operator+=(const a &s) { for( int i=0;i<10;++i ) b[i]+=s.b[i]; return *this; } const a operator+(const a &s) { return a(*this)+=s;} }; または class a{ public: int *b; bool new_b; a(){b=new int[10]; new_b=true;} a( const a& s ){ b=s.b; new_b=false; } ~a(){if (new_b) delete b;} a& operator=(const a &s) { if( b!=s.b ) for( int i=0;i<10;++i ) b[i]=s.b[i];return *this; } a& operator+=(const a &s) { for( int i=0;i<10;++i ) b[i]+=s.b[i]; return *this; } const a operator+(const a &s) { return a(*this)+=s; } };

msms001999
質問者

お礼

ありがとうございます。参考にします。

回答No.2

 こんにちは。  リファレンスカウンタを持たせて、コピーコンストラクタと代入演算子で回数を計測するか、外側のクラスをboost::shared_ptrの様なスマートポインタに入れるかすれば対応出来ると思います。

msms001999
質問者

お礼

ご回答ありがとうございます。 リファレンスカウンタは効率ということで手間はかからないので、クラスにつけて不都合がなければ使用してみます。

関連するQ&A