2011-12-13 85 views
15

我对C++比较陌生,并且在工作中处理相当大的C++项目。我注意到少数函数将双指针作为函数将在堆上实例化的对象的参数。例如:C++为什么双指针出/返回函数参数?

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

    return 0; 
} 

我只是不确定为什么双指针总是用在这个项目中,而不是一个单一的指针?这大多是一个语义暗示,它是一个out/return参数,还是有更多的技术原因,我没有看到?

+2

因为否则你会修改本地副本,而不是保存指针的变量。不要忘记有参考文献,这是一种更清洁的方式。 – 2011-12-13 19:25:52

+0

我忘记了指针的实际值被复制到了。我以为它是隐式引用的,但是它来自我的Java背景。 – 2011-12-13 19:41:12

回答

21

使用双指针模式,以便新分配的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); 

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

7

简短的答案是C++中的参数是按值传递的,所以你的函数接收到该指针的一个副本。一旦你将它覆盖在你的函数中,改变就会丢失。

然而,你的代码段想要从外部看到更改,所以它需要一种方法来覆盖实际指向该对象的指针,所以它必须获得指向该类指针的指针副本,因此它可以覆盖内部指针并从外部可见。

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 

有些方法可以使这个工作,而不是使用指针指针,其相对优点可以辩论。

3

这两颗星(双指针)意味着一个“指针指针”。这是一种绕过限制的方法,您不能从C++中的函数返回两件事情(在您的情况下,指示成功或失败的返回代码以及新分配的对象)。

1

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