gpt4 book ai didi

c++ - SQLite:连续调用finalize

转载 作者:行者123 更新时间:2023-11-30 04:54:50 26 4
gpt4 key购买 nike


我有一个函数,旨在通过 UID 标识符从 SQLite 数据库中删除具体行。

顺序如下:
1.创建选择查询以检查该行是否存在
2. 准备查询
3.绑定(bind)行UID
4. 步骤
5.完成
如果该行存在
{
6.创建删除查询
7.准备好
8.绑定(bind)UID
9. 步骤
10.完成
11.完成

如您所见,它首先检查该行是否存在,以便在所需的 UID 错误时通知调用者,然后创建新的删除查询。

该程序在约 14/15 个测试用例中按预期运行。在程序崩溃的情况下,它会崩溃到最后一次完成调用(第 11 点)。我检查了所有数据,似乎一切都是有效的。

问题是连续调用 finalize 函数的预期行为是什么。我尝试依次设置 ​​5 次 finalize 调用,但行为是相同的。

最佳答案

虽然the documentation不觉得有必要明确说明这一点,很明显您正在做的是“未定义的行为”(在库的范围内)。

很像删除动态分配的内存,您应该完成一次。不是两次,也不是五次,而是一次。完成准备好的语句后,它已被“删除”并且不再存在。对该准备好的语句的任何进一步操作构成了文档所称的“严重错误”(如果我们假设对 finalize 的多余调用构成“使用”;我们为什么不呢?)。

幸运的是,没有理由需要这样做。所以,很简单,不要!如果您的设计使您失去了对代码流的控制,并且在 finalize 点,由于某种原因没有足够的关于程序上下文的信息来知道准备好的语句是否已经完成,这很好:就像我们对指针所做的一样,您可以将其设置为 nullptr,以便后续调用是无操作。但如果您需要这样做,您真的应该重新审视您的设计。

为什么它看起来对你有用?纯粹的机会,就像任何其他未定义的行为一样:

Any use of a prepared statement after it has been finalized can result in undefined and undesirable behavior such as segfaults and heap corruption.

另请参阅:“为什么我不能在不打开车门的情况下将车门关上两次?”“为什么我不能剃掉我想象中的 mustache ?”/p>

关于c++ - SQLite:连续调用finalize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53390865/

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