Obj *obj = new Obj();
obj->destroy();
if (obj == NULL)
cout << "yes";
如何编写方法“destroy()”输出“是”?
答案 0 :(得分:3)
不可能,因为obj
是本地变量。 destroy()
无法访问呼叫站点上的任何本地变量。
你所要求的是不可能的:
void f()
{
// set main's i to some other value? --> impossible
}
int main()
{
int i = 0;
f();
if (i == 1) {
// ...
}
}
至于你的例子,可以在this
内访问的destroy()
指针确实指向动态分配的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 ++中不是惯用的。您尝试解决一些潜在的问题。您可能希望确保未在空指针上调用destroy()
,或者不再使用指向已销毁对象的指针。这个目标是正确的,但你的策略是错误的。请查看std::unique_ptr
以获得完全不同的方法。
答案 1 :(得分:1)
你不能。对象控制自身,但它不控制指向它的指针。它甚至不知道指向它的指针(可能有很多)。
你可以采用相反的方法,使用unique_ptr或shared_ptr,如下所示:
destroy()
中的逻辑,将其放在Object
。std::unique_ptr
代替标准指针。然后你最终得到这样的东西:
std::unique_ptr<Obj> ptr(new Obj());
// ... do things with ptr ...
ptr.reset(nullptr); // Does teardown automatically and sets ptr to null