gpt4 book ai didi

c++ - 数据库连接池的 std::stack 中的原始指针或 std::shared_ptr

转载 作者:行者123 更新时间:2023-11-28 00:07:29 24 4
gpt4 key购买 nike

我搜索了 google 和 stackoverflow,但没有找到适合我特定用途的答案。关于原始指针和 std::shared_ptr 的优点有很多很好的建议,但与 std::stack 无关。

我看过 Herb Sutters 在 youtube 上谈论如何编写好的 C++14 代码 (https://www.youtube.com/watch?v=hEx5DNLWGgA),其中一个主题是为什么唯一指针和共享指针很有用。

所以我将我的简单数据库连接池从原始指针重写为 std::shared_ptr。在我 top()/pop() 连接堆栈并与数据库交互后,我将其推回。

在构造函数中使用原始指针

Database::Database(const unsigned int connections) {
for (int i = 0; i < connections; ++i) {
try {
auto* dbconn = new pqxx::connection(connectionString);
dbpool.push(dbconn);
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}
}
}

后来

auto *D = dbpool.top();
dbpool.pop();

std::string query = "select * from races order by racestart_at desc";
pqxx::nontransaction N(*D);
pqxx::result R(N.exec(query));

dbpool.push(D);

在构造函数中使用 shared_ptr

auto* dbconn = new pqxx::connection(connectionString);
std::shared_ptr<pqxx::connection> s_dbconn(dbconn);
dbpool.emplace(s_dbconn);

在程序中

auto D = dbpool.top();
dbpool.pop();
<query db etc.>
dbpool.push(D);

在这种情况下,原始指针和共享指针一样好吗?我看不到原始指针会误入那么多地方。

最佳答案

一切都与所有权有关。使用共享指针,其中多段代码(对象)可以同时拥有该指针。

对于您使用池的示例,创建一个连接对象数组(std::array 或 std::vector)并创建另一个指针数组(或您的情况下的堆栈)可能是个好主意(或索引)到第一个数组中的对象。然后,当从池中请求连接对象时,您将一个连接对象作为原始指针返回,然后您需要一个函数将连接“返回”回池中,以便可以重复使用。

在这种方式下,只有池实际上拥有连接对象,所以它应该是唯一一个删除它们的对象。其他代码只使用该对象但不应该删除它,而是应该在使用完后将其返回到池中。

增强这一点的一种方法是从池中返回一个特殊的对象/类而不是原始指针。这个对象就像一个管理连接对象借用的小型 RAII 包装器。因此,一旦它被销毁,它就会将连接对象返回到池中。我相信您可以为此目的使用带有自定义删除器的 unique_ptr。

关于c++ - 数据库连接池的 std::stack 中的原始指针或 std::shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34694357/

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