首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLite:连续调用finalize

SQLite:连续调用finalize
EN

Stack Overflow用户
提问于 2018-11-20 10:21:57
回答 1查看 238关注 0票数 1

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

顺序如下:

  1. 创建select查询以检查该行是否存在
  2. 准备查询
  3. 绑定行UID
  4. 步骤
  5. 定案 如果存在行 { 6.创建删除查询 7.准备 8.约束UID 9.步骤 10.最后确定 11.最后确定 }

正如您首先看到的,它检查行是否存在,以便在所需的UID错误时通知调用方,而不是创建新的delete查询。

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

问题是连续调用finalize函数的预期行为是什么。我试着设置5次一个接一个的finalize调用,但是行为是一样的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-20 11:06:00

尽管文献资料不认为有必要明确地声明这一点,但是很明显,您所做的是“未定义的行为”(在库的范围内)。

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

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

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

在准备好的语句完成后,任何使用它都可能导致未定义和不受欢迎的行为,例如分段错误和堆损坏。

另见:“为什么我不能关上两次车门而不打开呢?”“为什么我不能刮掉我想象中的胡子?”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53390865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档