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

时间:2011-12-13 19:21:50

标签: c++

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

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

    return 0;
}

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

5 个答案:

答案 0 :(得分:25)

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

MyClass* pValue;
someFunc(&pValue);
// pValue now contains the newly allocated MyClass

此处单个指针不足,因为参数在C ++中按值传递。因此,单个指针的修改只能在someFunc内看到。

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

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

MyClass* pValue;
someFunc(pValue);

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:3)

这两个星(双指针)意味着“指向指针”。这是一种绕过限制的方法,你不能从C ++中的函数返回两个东西(在你的例子中,返回代码表示成功或失败,以及新分配的对象)。

答案 3 :(得分:2)

使用单个指针就行不通了。考虑:

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

MyClass* ptr = null;
someFunc(ptr);
// ptr is still null and we've got a memory leak

除了使用指针指针之外,还有其他方法可以解决这个问题,可以讨论它的相对优点。

答案 4 :(得分:1)

返回X的规范方法是将指针传递给X.如果X是“指向MyClass的指针”,则返回它的规范方法是传递“指向MyClass的指针”。你不能只是将指向MyClass的指针传递给函数,因为调用者不知道该指针的值应该是什么。