C++为什么双指针输出/返回函数参数?

Bre*_*hns 20 c++

我对C++比较陌生,在工作中处理一个相当大的C++项目.我注意到一些函数将双指针作为函数将在堆上实例化的对象的参数.例:

int someFunc(MyClass** retObj) {
    *retObj = new MyClass();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我只是不确定为什么在这个项目中总是使用双指针,而不仅仅是一个指针?这主要是一个语义提示,它是一个输出/返回参数,还是有一个我没有看到的技术原因?

Jar*_*Par 25

使用双指针模式,以便可以将新分配的模式MyClass传递给调用者.例如

MyClass* pValue;
someFunc(&pValue);
// pValue now contains the newly allocated MyClass
Run Code Online (Sandbox Code Playgroud)

这里单指针不足,因为参数是通过C++中的值传递的.所以单个指针的修改只能从内部看到someFunc.

注意:使用C++时,应考虑在此方案中使用引用.

int someFunc(MyClass*& retObj) {
  retObj = new MyClass();
  return 0;
}

MyClass* pValue;
someFunc(pValue);
Run Code Online (Sandbox Code Playgroud)

这允许您通过引用而不是值传递参数.因此,调用者可以看到结果.


Bli*_*ndy 8

简短的回答是C++中的参数是按值传递的,因此您的函数会收到该指针的副本.一旦在函数内覆盖它,更改就会丢失.

但是你的代码片段希望从外部可以看到更改,因此它需要一种方法来覆盖指向对象的实际指针,因此它必须获得指向类的指针的指针的副本,因此它可以覆盖内部指针,让它从外面可见.