我对C ++比较陌生,在工作中处理一个相当大的C ++项目。我注意到一些函数将双指针作为函数将在堆上实例化的对象的参数。例如:
int someFunc(MyClass** retObj) {
*retObj = new MyClass();
return 0;
}
我只是不确定为什么在这个项目中总是使用双指针,而不仅仅是一个指针?这主要是一个语义提示,它是一个输出/返回参数,还是有一个我没有看到的技术原因?
答案 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的指针传递给函数,因为调用者不知道该指针的值应该是什么。