В ваших функциях bind_text
и bind_texts
вам необходимо использовать временный деструктор. Когда вы передаете Swift String
функции C в качестве аргумента const char *
, Swift не гарантирует, что указатель останется действительным после возврата функции C. В статье Вызов функций с параметрами указателя говорится следующее:
Указатель, передаваемый функции, гарантированно действителен только на время вызова функции. Не сохраняйте указатель и не обращайтесь к нему после того, как функция вернулась.
В ваших bind_blob
и bind_blobs
функциях зависит, откуда взялся UnsafeRawPointer
и когда вы выполните SQL заявление. Если вы получаете указатель с использованием какой-либо функции Swift withUnsafeWhatever
, то указатель недействителен после возврата функции withUnsafeWhatever
. Например, документация withUnsafeBytes(of:_:)
гласит следующее:
Аргумент указателя буфера действителен только на время выполнения замыкания.
Если вы связываете свой BLOB-объект, выполняете инструкцию, а затем больше не используете привязку, тогда вы можете использовать деструктор stati c. Это нормально с деструктором stati c:
let data: Data = ...
data.withUnsafeBytes { rawBuffer in
if let pointer = rawBuffer.baseAddress {
bind_blob(statement, (pointer, rawBuffer.count))
execute(statement)
// No more use of statement unless the parameter is rebound.
}
}
Но это не нормально с деструктором stati c:
let data: Data = ...
data.withUnsafeBytes { rawBuffer in
if let pointer = rawBuffer.baseAddress {
bind_blob(statement, (pointer, rawBuffer.count))
}
}
execute(statement)