作者:justmoon999 | 来源:互联网 | 2023-01-29 09:49
据我所知,在C++领域,它主张使用智能指针.我有一个简单的程序如下.
/* main.cpp */
#include
#include
using namespace std;
/* SQLite */
#include "sqlite3.h"
int main(int argc, char** argv)
{
// unique_ptr db = nullptr; // Got error with this
shared_ptr db = nullptr;
cout <<"Database" <
当我使用unique_ptr行编译时得到一条错误消息:
error C2027: use of undefined type 'sqlite3'
error C2338: can't delete an incomplete type
当我使用shared_ptr行编译时,它是成功的.从几个问题和答案我的理解是unique_ptr应该是首选,因为我不打算让对象共享资源.在这种情况下,最佳解决方案是什么?使用shared_ptr还是回到裸指针(new/delete)的旧方法?
1> StoryTeller ..:
一般的方法是@ SomeProgrammerDudes的答案(接受它).但为了解决你的担忧,我发布了这个.
你不应该回到raw new并删除.既不是因为sqlite3
是不透明的类型,也不是因为它的开销std::shared_ptr
.您使用,作为指定的另一个答案,a std::unique_tr
.
唯一的区别是您如何设置自定义删除器.因为std::unique_ptr
它是类型定义的一部分,而不是运行时参数.所以你需要做这样的事情:
struct sqlite3_deleter {
void operator()(sqlite3* sql) {
sqlite3_close_v2(sql);
}
};
using unique_sqlite3 = std::unique_ptr;