2016-03-22 7 views
0
Obj *obj = new Obj(); 
obj->destroy(); 
if (obj == NULL) 
    cout << "yes"; 

メソッド "destroy()"を出力して "yes"を出力する方法はありますか?ポインタ自体がどのようにNULLにすることができますか?

+6

要するに:できません。 –

+2

自分で物事を激しくしないでください.... 'void Obj :: destroy(){cout <<" yes "; } ':) –

+0

^^ lol厳密には正しいが、OPが実際に望んでいたものではないと思われる。 –

答えて

3

インポッシブル。 destroy()は、コールサイトのローカル変数にアクセスできません。

あなたの例については
void f() 
{ 
    // set main's i to some other value? --> impossible 
} 

int main() 
{ 
    int i = 0; 
    f(); 
    if (i == 1) { 
     // ... 
    } 
} 

destroy()内でアクセスできるthisポインタが動的に割り当てられたObjオブジェクトを指すんが、どのように知ることになっている:

は何を求めていることは、このように不可能ですその同じObjオブジェクトへの他のポインタについては?できない。それが言語の仕組みです。

技術的には、もちろん、あなただけのローカル変数への参照を渡すことができます。

#include <iostream> 

struct Obj 
{ 
    void destroy(Obj*& ptr) 
    { 
     ptr = nullptr; 
    } 
}; 

int main() 
{ 
    Obj *obj = new Obj(); 
    obj->destroy(obj); 
    if (obj == nullptr) 
     std::cout << "yes"; 
} 

実際に、しかし、これは全く意味を成さないし、C++での慣用ではありません。あなたが解決しようとする根本的な問題がいくつかあります。 NULLポインタでdestroy()が呼び出されていないこと、または破棄されたオブジェクトへのポインタが使用されていないことを確認することをお勧めします。その目標は正しいが、あなたの戦略は間違っている。完全に異なるアプローチのためにstd::unique_ptrを見てください。

1

できません。オブジェクトは自分自身を制御しますが、ポインターを指すポインターは制御しません。それを指しているポインター(多くの場合があります)を認識していません。 、代わりにdestroy()で「ティアダウン」のロジックを持つの

  • Objectのデストラクタでそれを置く:

    あなたはこのようなunique_ptrをやshared_ptrのを、使用してしかし逆のアプローチを取ることができます。

  • 標準ポインタの代わりにstd::unique_ptrを使用してください。

次に、あなたがこのようなもので終わる:objローカル変数あるので、

std::unique_ptr<Obj> ptr(new Obj()); 
// ... do things with ptr ... 
ptr.reset(nullptr); // Does teardown automatically and sets ptr to null 
関連する問題