【发布时间】:2016-04-14 03:47:09
【问题描述】:
我搜索了 google 和 stackoverflow,但没有找到适合我特定用途的答案。关于原始指针和 std::shared_ptr 的优点有很多很好的建议,但与 std::stack 无关。
我在 youtube 上观看了 Herb Sutters 关于编写优秀 C++14 代码 (https://www.youtube.com/watch?v=hEx5DNLWGgA) 的演讲,其中一个主题是为什么唯一和共享指针很有用。
所以我改写了从原始指针到 std::shared_ptr 的简单数据库连接池。在我 top()/pop() 堆栈进行连接并与数据库交互后,我 push() 将其返回。
在构造函数中使用原始指针
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);
在这种情况下,原始指针和共享指针一样好吗?我不认为原始指针会误入歧途。
【问题讨论】:
-
This 应该可以帮到你。
-
谢谢。我读过类似的线程,其中也提到了生命周期管理,并且在生命周期比程序短的范围内使用它们时很容易体会到好处。我可以想象的用例是如果我忘记将连接 push() 回池。但是他们无论如何我将在几个周期后无法连接到数据库。
标签: c++ pointers c++11 stack shared-ptr