2016-12-14 3 views
3

2番目のパラメータが指定されていない場合、デフォルトでポインタをインスタンス化する関数があります。 は、C++のデフォルトポインタパラメータで呼び出されるdeleteです

void doSomething(int a, Obj* obj = new Obj()) { 
... 
} 

は、私は私がobjリリースしたいか、私はデフォルトのparam値からポインタをインスタンス化した場合に自動的に行われている場合、明示的に関数内の削除コールする必要がありますか?

2番目の引数が渡された場合、呼び出し元から渡されたポインタを削除したくないので、明示的にdeleteを実行しないようにしたいと考えています。

+3

':よう

何か。カウントを参照するスマートなポインタベースのパラメータを考慮してください。そうでなければ、オブジェクトがデフォルトのパラメータとして構築されたかどうかわかりません。 – Donnie

+2

* "明示的に削除するのは避けたいです。なぜなら2番目の引数が渡されると、呼び出し元が渡したポインタを削除したくありません。 "*右。だからあなたはこのパターンを使うことができません。 –

+0

これは、doSomething(int a、Obj * obj)をobjポインタで管理する 'doSomething(int a)'オーバーロードを単純に持つ機会のようです。それともスマートなポインタ。また、誰かが関数にヌルポインタを明示的に渡すとどうなりますか? 'obj'が決してnullではないことを保証しようとしているようですが、これは悪い方法です... – jaggedSpire

答えて

6

あなたのメモリの所有権セマンティクスはリワークが必要です。場合によっては、あなたが持っていないメモリと他のものを所有していることがあります。デフォルトでObjのインスタンスを作成することを主張する場合は、メモリを所有しているかどうかを示すブール値も受け入れます。結局のところ、私は実際に、これを達成するために代わりにオーバーロードを使用することをお勧めします。ここでは、1つの関数が1つの引数と他の2つの引数を取ります。 1つだけを受け入れるものはObjのインスタンスを作成し、次にdoSomethingのファンクションを呼び出します。

言語によって呼び出されることはありませんDELETE`
void doSomething(int a, Obj* obj) { 
... 
} 

void doSomething(int a) { 
    Obj tmp; 
    doSomething(a, &tmp); 
} 
関連する問題