在 C++ 中验证指向指针的指针

Validating a pointer to a pointer in C++

我正在尝试编写一个函数来接收一个指针,使用它,然后使它指向一个新对象。为此,我使用了 ptr-to-ptr。这就是我验证函数接收到的 ptr-to-ptr 的方式:

void modifyPtr(Obj ** ptrToPtr)
{
    if (*ptrToPtr == nullptr)
    {
        return;
    }
    else
    {
        // Do everything else!
    }
}

写这篇文章时,我想:如果客户端将以下内容传递给我的函数怎么办?

Obj ** ptrToPtr = nullptr;
modifyPtr(ptrToPtr);

在那种情况下,我的验证将很危险,因为我将取消引用 nullptr。那么,我是否应该添加额外的验证步骤?

void modifyPtr(Obj ** ptrToPtr)
{
    if (ptrToPtr == nullptr)
    {
        return;
    }
    else if (*ptrToPtr == nullptr)
    {
        return;
    }
    else
    {
        // Do everything else!
    }
}

我以前从未见过这样的验证,这就是我犹豫的原因。

请注意,我知道应该避免在 C++ 中使用原始指针。我正在使用旧代码,我发现这个问题很有趣。

//使用引用。

void modifyPtr(Obj *& ptrToPtr)
{
    if (ptrToPtr == nullptr)
    {
        return;
    }
    else
    {
        // Do everything else!
    }
}

Obj * ptrToPtr = nullptr;
modifyPtr(ptrToPtr);

如果您不取消引用任何内容,则在您的第一个。您只需检查传递的指针是否为空。所以你不必担心。只需删除我在手机上没有注意到的 *

你的第一次验证是错误的,因为你在检查它是否为 null 之前取消引用 ptrToPtr

您可能不需要检查取消引用的指针是否为 null,因为无论如何您都将更改它(除非您需要对旧对象执行某些操作)。

但是,您应该更喜欢使用引用而不是双指针,例如:

void modifyPtr(Obj* &Ptr)

那么调用者就不能传入空引用(不进行丑陋的修改)。

如果您只是 return 新指针而不是修改参数,则只需一级间接和更简单的验证就可以摆脱困境。调用者可以决定是否要立即将其重新分配给旧值。