【发布时间】:2021-09-27 16:29:45
【问题描述】:
我正在使用 RocksDB,它需要一个指向打开指针的指针:
rocksdb::DB* db{nullptr};
const rocksdb::Status status = rocksdb::DB::Open(options, path, &db);
正如预期的那样,我想使用unique_ptr。但是,不幸的是,如果我这样做:
std::unique_ptr<rocksdb::DB> db;
const rocksdb::Status status = rocksdb::DB::Open(options, fileFullPath, &(db.get()));
我明白了:
error: lvalue required as unary ‘&’ operand
如果我使用原始指针然后创建一个unique_ptr:
std::unique_ptr<rocksdb::DB> _db; // Class member
rocksdb::DB* db;
const rocksdb::Status status = rocksdb::DB::Open(options, fileFullPath, &db));
_db = std::make_unique<rocksdb::DB>(db);
我明白了:
error: invalid new-expression of abstract class type ‘rocksdb::DB’
{ return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }
我该如何使用unique_ptr?
【问题讨论】:
-
不应该是
_db.reset(db);吗? -
我认为
reset()只有当它当前持有一个有效值时,否则它是make_unique -
&(db.get())翻译得到unique_ptr所代表的地址,然后取地址的地址。不是你想要的。您收到的错误消息是因为返回的地址位于临时变量中,您无法获取临时地址。它们的存在时间还不够长,无法发挥作用。 -
@user4581301 这个页面隐含地暗示我可以在我希望的时候删除指针:rocksdb.org/docs/getting-started.html
-
好。消除了一个潜在的问题来源。
标签: c++