指针本身如何使其成为NULL?

时间:2016-03-22 17:39:36

标签: c++

Obj *obj = new Obj();
obj->destroy();
if (obj == NULL)
    cout << "yes";

如何编写方法“destroy()”输出“是”?

2 个答案:

答案 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,如下所示:

  • 而不是&#34; teardown&#34; 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