Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 验证指向C+中指针的指针+;_C++_Pointers_Nullptr - Fatal编程技术网

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

C++ 验证指向C+中指针的指针+;,c++,pointers,nullptr,C++,Pointers,Nullptr,我正在尝试编写一个函数,该函数接收指针并使用它,然后使它指向一个新对象。为了做到这一点,我使用了一个ptr到ptr。这就是我如何验证我的职能部门收到的ptr到ptr的方式: void modifyPtr(对象**ptrToPtr) { 如果(*ptrToPtr==nullptr) { 返回; } 其他的 { //做其他的一切! } } 在写这篇文章时,我想:如果客户机将以下内容传递给我的函数呢 Obj**ptrToPtr=nullptr; 修改PTR(ptrToPtr); 在这种情况下,我的

我正在尝试编写一个函数,该函数接收指针并使用它,然后使它指向一个新对象。为了做到这一点,我使用了一个ptr到ptr。这就是我如何验证我的职能部门收到的ptr到ptr的方式:

void modifyPtr(对象**ptrToPtr)
{
如果(*ptrToPtr==nullptr)
{
返回;
}
其他的
{
//做其他的一切!
}
}
在写这篇文章时,我想:如果客户机将以下内容传递给我的函数呢

Obj**ptrToPtr=nullptr;
修改PTR(ptrToPtr);
在这种情况下,我的验证将是危险的,因为我将取消对nullptr的引用。那么,我应该添加一个额外的验证步骤吗

void modifyPtr(对象**ptrToPtr)
{
if(ptrToPtr==nullptr)
{
返回;
}
否则如果(*ptrToPtr==nullptr)
{
返回;
}
其他的
{
//做其他的一切!
}
}
我以前从未见过这样的验证,这就是为什么我犹豫不决的原因

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

//请使用引用

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

Obj * ptrToPtr = nullptr;
modifyPtr(ptrToPtr);
//使用参考资料

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

Obj * ptrToPtr = nullptr;
modifyPtr(ptrToPtr);

在你的第一次,如果你不去引用任何东西。您只需检查传递的指针是否为null。所以你不必担心。如果您没有取消引用任何内容,请在第一次使用手机时删除我没有注意到的*。您只需检查传递的指针是否为null。所以你不必担心。只需删除我在手机上没有注意到的*即可

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

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

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

void modifyPtr(Obj* &Ptr)

然后调用者不能传入空引用(如果不进行丑陋的破解)。

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

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

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

void modifyPtr(Obj* &Ptr)

然后调用者就不能传入空引用(如果不进行难看的破解)。

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

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

您的第一次验证是错误的,因为您在检查它是否为空之前取消了对
ptrToPtr
的引用。您可能不需要检查取消引用的指针是否为null,因为您无论如何都要更改它(除非您需要对旧对象执行某些操作)。但是,更喜欢使用引用而不是双指针,例如:
voidmodifyptr(Obj*&Ptr)
,那么调用方就不能传递空引用
,如果(ptrToPtr&&ptrToPtr){/*dostuff*/}
@RemyLebeau您可以直接复制并粘贴该注释作为答案,这将是一个很好的答案!无关:大量使用原始指针并没有错。拥有原始指针是您想要避免的。您希望自动化管理,使其更难错过清理等,但在此之后,传递原始指针可能正是正确的做法。但还是喜欢尽可能地传递参考资料。是的@RemyLebeau,你应该把它作为一个答案发布,我会接受的。这是一个很好的答案!谢谢:-)您的第一次验证是错误的,因为您在检查它是否为空之前取消了对
ptrToPtr
的引用。您可能不需要检查取消引用的指针是否为null,因为您无论如何都要更改它(除非您需要对旧对象执行某些操作)。但是,更喜欢使用引用而不是双指针,例如:
voidmodifyptr(Obj*&Ptr)
,那么调用方就不能传递空引用
,如果(ptrToPtr&&ptrToPtr){/*dostuff*/}
@RemyLebeau您可以直接复制并粘贴该注释作为答案,这将是一个很好的答案!无关:大量使用原始指针并没有错。拥有原始指针是您想要避免的。您希望自动化管理,使其更难错过清理等,但在此之后,传递原始指针可能正是正确的做法。但还是喜欢尽可能地传递参考资料。是的@RemyLebeau,你应该把它作为一个答案发布,我会接受的。这是一个很好的答案!谢谢:-)这不是一个丑陋的黑客,只是一个等待发生的意外<代码>对象**ptrToPtr=GetPP()
Obj**GetPP(){if(某些条件)返回nullptr;…}
。我被这段真实的代码烧死了,所以我现在对它特别敏感。如果存在空指针的可能性,不要试图将其转换为引用,并认为您是安全的。请看我的完整解释。这不是一个丑陋的黑客,只是一个等待发生的意外<代码>对象**ptrToPtr=GetPP()
Obj**GetPP(){if(某些条件)返回nullptr;…}
。我被这段真实的代码烧死了,所以我现在对它特别敏感。如果存在空指针的可能性,不要试图将其转换为引用,并认为您是安全的。请参阅我的详细说明。