gpt4 book ai didi

C++智能指针混淆

转载 作者:太空狗 更新时间:2023-10-29 19:51:25 25 4
gpt4 key购买 nike

我了解到在C++领域提倡使用智能指针。我有一个简单的程序如下。

/* main.cpp */
#include <iostream>
#include <memory>
using namespace std;

/* SQLite */
#include "sqlite3.h"

int main(int argc, char** argv)
{
// unique_ptr<sqlite3> db = nullptr; // Got error with this
shared_ptr<sqlite3> db = nullptr;

cout << "Database" << endl;
return 0;
}

当我使用 unique_ptr 行编译时得到一条错误消息:

error C2027: use of undefined type 'sqlite3'
error C2338: can't delete an incomplete type

当我用 shared_ptr 行编译时,它是成功的。从几个问题和答案中,我的理解是 unique_ptr 应该是首选,因为我不打算让对象共享资源。在这种情况下最好的解决方案是什么?使用 shared_ptr 还是回到裸指针的旧方法(新建/删除)?

最佳答案

一般方法在@SomeProgrammerDudes 的回答中(接受)。但为了解决您的顾虑,我发布了这个。

你不应该回到原始的新的和删除的。既不是因为 sqlite3 是不透明类型,也不是因为 std::shared_ptr 的开销。正如指定的其他答案一样,您使用 std::unique_tr

唯一的区别是您如何设置自定义删除器。对于 std::unique_ptr,它是类型定义的一部分,而不是运行时参数。所以你需要做这样的事情:

struct sqlite3_deleter {
void operator()(sqlite3* sql) {
sqlite3_close_v2(sql);
}
};

using unique_sqlite3 = std::unique_ptr<sqlite3, sqlite3_deleter>;

关于C++智能指针混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45214238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com