C++为什么双指针出/返回函数参数?
问题描述:
我对C++比较陌生,并且在工作中处理相当大的C++项目。我注意到少数函数将双指针作为函数将在堆上实例化的对象的参数。例如:C++为什么双指针出/返回函数参数?
int someFunc(MyClass** retObj) {
*retObj = new MyClass();
return 0;
}
我只是不确定为什么双指针总是用在这个项目中,而不是一个单一的指针?这大多是一个语义暗示,它是一个out/return参数,还是有更多的技术原因,我没有看到?
答
使用双指针模式,以便新分配的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);
这允许您通过引用而不是按值传递参数。因此,调用者可以看到结果。
答
简短的答案是C++中的参数是按值传递的,所以你的函数接收到该指针的一个副本。一旦你将它覆盖在你的函数中,改变就会丢失。
然而,你的代码段想要从外部看到更改,所以它需要一种方法来覆盖实际指向该对象的指针,所以它必须获得指向该类指针的指针副本,因此它可以覆盖内部指针并从外部可见。
答
使用单个指针是行不通的。考虑:
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
有些方法可以使这个工作,而不是使用指针指针,其相对优点可以辩论。
答
这两颗星(双指针)意味着一个“指针指针”。这是一种绕过限制的方法,您不能从C++中的函数返回两件事情(在您的情况下,指示成功或失败的返回代码以及新分配的对象)。
答
返回X的规范方法是将指针传递给X.如果X是“指向MyClass的指针”,则返回它的规范方法是将“指向指向MyClass的指针”传递给它。你不能只将一个指向MyClass的指针传递给该函数,因为调用者不知道该指针的值应该是什么。
因为否则你会修改本地副本,而不是保存指针的变量。不要忘记有参考文献,这是一种更清洁的方式。 – 2011-12-13 19:25:52
我忘记了指针的实际值被复制到了。我以为它是隐式引用的,但是它来自我的Java背景。 – 2011-12-13 19:41:12