2009年10月17日土曜日

C++のコピーコンストラクタ

C++のコピーコンストラクタのありがたみに関する調査.
コピーコンストラクタが役に立つのは以下の3つの場合である.

・宣言文でオブジェクトを使用して,他のオブジェクトを宣言する
・関数に仮引数としてオブジェクトを渡すとき
・関数の戻り値として使用する一時オブジェクトを作成したとき

例えば,仮引数にクラスcarのオブジェクトを渡す
void printobj(car obj){ ... }
の場合は,コピーコンストラクタなしでは,正確なコピーを行うので,
ポインタ変数があると,関数を抜けるときに,デストラクタが呼ばれて
メモリの解放が行われる.
さらに関数を呼んだ側でデストラクタを呼ぶと,ポインタ変数の指す先のメモリは
既に解放された状態であるから,ここで二重解放なってしまう.

二重解放がまずい理由は,
ttp://d.hatena.ne.jp/aki-yam/20081205/1228490763
によると,2つのポインタ変数が同じアドレスを指しているときに
その症状が現れるということらしい.

int *p1 = new int;// エラーチェックは省略
*p1 = 100;
delete p1;
int *p2 = new int;
delete p1;//ここで二重解放
*p2 = 200;
ここで p1 == p2だとすると厄介ということである.

他にも例があるかもしれないが,これだけでも不味いということが
分かったのでよしとしよう.

正確なコピーを作らせないように挙動を制御するのが,
コピーコンストラクタの役割である.

0 件のコメント:

コメントを投稿

フォロワー

ページビューの合計