2009-07-30 2 views
1
Class A 
{ 
    public: 
    NullIt() 
    { 
     this = NULL; 
    } 

    Foo() 
    { 
     NullIt(); 
    } 
} 

A * a = new A; 
a->Foo(); 

assert(a); //should assert here 

この効果を達成する方法はありますか?メモリリークは脇にありますか?オブジェクトインスタンスは、自分自身への "this"ポインタを安全にnullにできますか?

+2

パブリックメソッドを別のパブリックメソッドでラップするのはなぜですか?なぜ単に - > NullIt()ではないのですか? (これは、OOの観点からだけではありません) –

+1

スタックにAが割り当てられている場合も考慮してください。 this = NULLとはどういう意味ですか?オブジェクトはスタック上に残っています... –

答えて

5

いいえオブジェクトは、外部参照(この場合「a」)について何も知らないため、オブジェクトを変更することはできません。

あなたは、発信者があなたのオブジェクトを忘れるしたい場合は、あなたがこれを行うことができます:

class MyClass 
{ 
    void Release(MyClass **ppObject) 
    { 
     assert(*pObject == this); // Ensure the pointer passed in points at us 
     *ppObject = NULL;   // Clear the caller's pointer 
    } 
} 


MyClass *pA = new A; 
pA->Release(&pA); 
assert(pA);    // This assert will fire, as pA is now NULL 

をあなたがリリースを呼び出すと、あなたはあなたがオブジェクトを保持するポインタを渡す、となるように、それはそれをヌル呼び出しの後、ポインタはNULLです。

(リリースは、()も「これを削除;」することができ、それは同時に自分自身を破壊するように)

+0

はい、これは私が必要としていたものです。オブジェクト自体は、このptrからそれを理解するのではなく、与えられた参照のみを扱うことができます。 – BuckFilledPlatypus

+1

Releaseをグローバル関数にしたいと思うかもしれません - これは "ポインタを2回使用する"ことを避けます。それでも、奇妙なパターン - 複数の参照はどうですか? – peterchen

+1

@peterchenグローバルをリリースするということは、 'this'(これはありません)と照合できないことを意味し、二重間接指定がないと、呼び出し側のスコープ内のポインタ値に影響を与える方法はありません。 –

6

あなたは正確にどのような効果を得ようとしていますか?

新しいポインタ(またはNULL)を 'this'に割り当てることはできますが、それはポインタ 'a'には影響しません。

+1

これに加えて、 "this"は実際には "メソッド"(実際には関数の引数)の引数リストの隠れ変数なので、再割り当てされていると思いましたメソッドが呼び出されるたびに、他の関数の引数と同じように?しかしこれはコンパイラに依存している可能性があります。 –

4

は定数ポインタです。ポインターの内容は変更できますが、ポインター自体は変更できません。

コメントに記載されているとおり、はい、constをキャストすることはできますが、それを変更してもそれは単なるローカル変数です。実際の外部参照には影響しません。

+1

いつでも型キャストで回避することができます。もちろんそれはあなたに何か良いことをさせるものではありません。 –

1

私はあなたがこれをやりたがっている理由は何も分かりません。メモリリークが発生するのは、aがポインタをまったく使わずに浮動するためです。とにかくあなたがthisに割り当てられないことはほとんど確信しています。主に意味がないからです。なぜあなたはそれをしたいのですか?

1

以下は、あなたがやりたいことはありません理由を考えてみて:

A *a = new A; 
A *b = a; 
a = NULL; 
assert(b); 

とこれをNULLに設定することがうまくいかない理由がわかります。

1

'this'ポインタは、コードに含まれているオブジェクトのインスタンスのアドレスです。this = null;は意味をなさないため、設定できません。あなたの探しているように見えるでしょう

Class A 
{ 
    public: 
    ~A 
    { 
     // clean up A 
    } 
} 

A * a = new A; 
delete a; 

assert(a); //should assert here 

これはメモリからインスタンスを解放します。しかし、他の参照がある場合は、それらのポインタはまだそのインスタンスがどこにあるかを指し示しています(良くありません!)、nullに設定する必要があります。

+3

削除はポインタをゼロにしません(いずれの場合も変更不可能)。私はそれを0に設定することをお勧めします。 –

関連する問題