Obj *obj = new Obj();
obj->destroy();
if (obj == NULL)
cout << "yes";
メソッド "destroy()"を出力して "yes"を出力する方法はありますか?ポインタ自体がどのようにNULLにすることができますか?
Obj *obj = new Obj();
obj->destroy();
if (obj == NULL)
cout << "yes";
メソッド "destroy()"を出力して "yes"を出力する方法はありますか?ポインタ自体がどのようにNULLにすることができますか?
インポッシブル。 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
を見てください。
できません。オブジェクトは自分自身を制御しますが、ポインターを指すポインターは制御しません。それを指しているポインター(多くの場合があります)を認識していません。 、代わりに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
要するに:できません。 –
自分で物事を激しくしないでください.... 'void Obj :: destroy(){cout <<" yes "; } ':) –
^^ lol厳密には正しいが、OPが実際に望んでいたものではないと思われる。 –