我有一个函数,目的是通过UID标识符从SQLite数据库中删除一个具体的行。
顺序如下:
正如您首先看到的,它检查行是否存在,以便在所需的UID错误时通知调用方,而不是创建新的delete查询。
该程序在14/15测试用例中按预期工作。在程序崩溃的情况下,它会崩溃到最后一次终结调用(第11点)。我检查了所有的数据,似乎所有的数据都是有效的。
问题是连续调用finalize函数的预期行为是什么。我试着设置5次一个接一个的finalize调用,但是行为是一样的。
发布于 2018-11-20 11:06:00
尽管文献资料不认为有必要明确地声明这一点,但是很明显,您所做的是“未定义的行为”(在库的范围内)。
就像动态分配内存的delete一样,您应该完成一次。不是两次不是五次而是一次。在你完成准备好的声明后,它已经被“删除”,不再存在。对该准备好的语句的任何进一步操作都构成文档所称的“严重错误”(如果我们假定对finalize的多余调用构成“使用”,那么为什么不呢?)
幸运的是,没有任何理由想要这样做。所以,很简单,不要!如果您的设计使您失去了对代码流的控制,并且由于某种原因,由于某种原因,您无法了解程序的上下文是否已经完成准备好的语句,这很好:就像我们对指针所做的一样,可以将其设置为finalize,这样后续的调用就不会发生操作了。但是,如果你需要这样做,你真的应该重新审视你的设计。
为什么看起来对你有用?纯粹的偶然,就像任何其他未定义的行为一样:
在准备好的语句完成后,任何使用它都可能导致未定义和不受欢迎的行为,例如分段错误和堆损坏。
另见:“为什么我不能关上两次车门而不打开呢?”“为什么我不能刮掉我想象中的胡子?”
https://stackoverflow.com/questions/53390865
复制相似问题