2016-03-20 16 views
0

関数内でインスタンス化されたオブジェクトを削除し、別の関数が呼び出されたときにどのように削除しますか?例えばインスタンス化されたオブジェクトを関数外で削除しますか?

int function_test(){ 
    object* a = new object(); 
} 

int function_test2(){ 
    delete a; 
} 

オブジェクトAはfunction_test2()が呼び出されたときに削除される必要があります。 Function_test()は、オブジェクトaの値を作成して設定します。

+1

あなたは参照せずにオブジェクトを削除することはできません。参照を戻します。それぞれの 'function_test()'呼び出しをクリーンアップするためには、 'function_test2()'を呼び出さなければならないことを文書化することに多くの注意を払っています。 – SJuan76

答えて

0

何かを削除するには、何かへのポインタが必要です。

あなたはfunction_test2に機能function_testにオブジェクトを割り当て、それを削除したいときは、削除したいオブジェクトへのポインタを手に入れるためにfunction_test2ための方法の世話をする必要があります。

ありことを行うための複数の方法がありますが、最も一般的なものは、発信者へのポインタを返すことfunction_testためのもので、その後、function_test2にそのポインタを渡す:

object* function_test() { 
    object* a = new object(); 
    ... 
    return a; 
} 

void function_test2(object* a) { 
    ... 
    delete a; 
} 

、発信者が転送」する必要があります「このようなポインタ:ポインタを転送する

object obj = function_test(); 
... 
function_test2(obj); 

他の方法、ファイルの静的ポインタを使用してグローバルポインタを使用して、インスタンス変数を使用しているときの機能function_testおよびfunction_test2はクラスのメンバ関数です。

+0

関数aは、オブジェクトaの値を作成および設定します。別の関数が呼び出されたときに削除する必要があります。 – Akito

+0

@Akitoあなたのコードでは、 'a'は' function_test'に対してローカルです。 'function_test'が終わった後は、コードにアクセスする方法はありません。あなたのコードでは、メモリリークになります。 – dasblinkenlight

+0

それは私が解決しようとしていることです。私は、オブジェクトaをインスタンス化し、function_test2が呼び出されたときにそれを削除しなければなりません。そして、それはfunction_testを呼び出してオブジェクトaを再作成します。私はそれがメモリリークを作成することを知っています。だからこそ私はこれに対する解決策を見出そうとしている。 – Akito

0

関数間でローカル変数を転送することはできません。このようなことをしたい場合は、ポインタを返すことをお勧めします。ポインタを次の関数に渡すことができます。

object *function_test() 
{ 
auto *o = new object{}; 
return o; 
} 

ただし、これは、この変数を呼び出してどこでもメモリ管理を行う必要があるという欠点があります。ほとんどの場合、あなただけの指向何かのオブジェクトを使用したい、と類似:

として使用することができます
class ObjectOwner final 
{ 
public: 
    int function_test(){ 
     a = new object(); 
    } 

    int function_test2(){ 
     delete a; 
    } 
private: 
    object *a{nullptr}; 
}; 

:あなたが第二を呼び出すことを忘れたときにようにstd::unique_ptr<object>を使用することになり

ObjectOwner owner; 
owner.function_test(); 
owner.function_test2(); 

さらに良いです関数は、メモリが解放されます。

最後に、コンストラクタ/デストラクタの使用を検討できます。あなたが書くことが許可

class ObjectOwner final 
{ 
public: 
    ObjectOwner() 
     : a(std::make_unique<object>()) 
    { 
    } 

    ~ObjectOwner() = default; 
    void func() { /*Do something with a*/ } 
private: 
    std::unique_ptr<object> a{}; 
}; 

ObjectOwner owner{}; 
owner.func(); 
関連する問題