传递双指针和指针作为参数的区别

The difference between passing double pointer and pointer as an argument

  1. 将 * 作为函数参数传递
#include <iostream>

class A {

 public: 
  A() {}

};


class B : public A{
 public:
  B() {}

};

void foo(A* a) {
 a = new B();

}

void ff() {
  A a;
  foo(&a);
}
  1. 将**作为函数参数传递
#include <iostream>

class A {

 public: 
  A() {}

};


class B : public A{
 public:
  B() {}

};

void foo(A** a) {
 *a = new B();

}

void ff() {
  A* a;
  foo(&a);
}

当我看到leveldb时,我对此感到困惑

具体代码如下

https://github.com/google/leveldb/blob/master/db/db_impl.cc#L1537

我觉得可以用FileLock lock

然后将&lock传给LockFile(const std::string& filename, FileLock* lock)

LockFile函数为this

传递双指针和只传递指针是不一样的

void foo(A* a) {
 a = new B();

}
  1. 将输入指针更改为另一个值。结果不会反映在被调用者 ff() 中。 这只是改变了论点。
void foo(A** a) {
 *a = new B();

}
  1. 将一个指针更改为另一个指针,并将该指针指向的值“另一个指针”更改为。结果将反映在 ff()

根据 ff(),我假设您有一个后续问题需要在调用 foo() 之后操作 a。所以第二个可能是一个正确的方法。

对于FileLock,我相信你指的是这个implementation

它使用双指针,因为它要替换 FileLock 的全部内容。

Live demo

跟进:为什么选择使用双指针而不是引用传递?

因为引用不可能被替换,我的假设是它选择了它选择了替换整个内容,这比使实现复杂化以重新初始化更简单。