在 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 新指针而不是修改参数,则只需一级间接和更简单的验证就可以摆脱困境。调用者可以决定是否要立即将其重新分配给旧值。
我正在尝试编写一个函数来接收一个指针,使用它,然后使它指向一个新对象。为此,我使用了 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 新指针而不是修改参数,则只需一级间接和更简单的验证就可以摆脱困境。调用者可以决定是否要立即将其重新分配给旧值。