- ベストアンサー
クラス内に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;}
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
コピーコンストラクタ a(const a& s) { b=new int[10]; std::copy(s.b, s.b+10, b); } みたいなのを作ってコピーできるようにしとけばいいでしょう。 関数呼ぶたびにコピーが発生するので、効率よくないですけど。 まあ最近は、効率は気にしないという作り方もありだと思います。 ちなみに、参照を使って、 operator+(a &s) 定義しているときの x + x; は、場合によっては危険(思ったように動かない)ですよ。 考えれば当たり前のことですけど、operator+(a &s)の中で、自分を変更すると、引数としてきたものも一緒に壊していくことになりますから。 今回の関数については大丈夫でしょうけど。
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
まちがえた. 「operator new[] を使って確保するなら operator delete[] で解放する」です. operator [] で確保って, そんなわけはない>自分.
- Tacosan
- ベストアンサー率23% (3656/15482)
・コピーコンストラクタを作る ・std::vector を使う くらいは思いつく. なお, operator [] を使って確保するなら, 消すときも operator delete[] を使ってやってください.
お礼
operatorにnewとdeleteがあったのは知りませんでした。ありがとうございます。
- akayoroshi
- ベストアンサー率50% (46/91)
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; } };
お礼
ありがとうございます。参考にします。
- machongola
- ベストアンサー率60% (434/720)
こんにちは。 リファレンスカウンタを持たせて、コピーコンストラクタと代入演算子で回数を計測するか、外側のクラスをboost::shared_ptrの様なスマートポインタに入れるかすれば対応出来ると思います。
お礼
ご回答ありがとうございます。 リファレンスカウンタは効率ということで手間はかからないので、クラスにつけて不都合がなければ使用してみます。
お礼
ご回答ありがとうございます。 コピーコンストラクタを使用してみます。 下記の処理は関数内部で書き換えが発生しないように気をつけます。