Предупреждение UnsafeMutablePointer с помощью Swift 5 - PullRequest
0 голосов
/ 26 марта 2020

У меня было это:

let alphaPtr = UnsafeMutablePointer<vImagePixelCount>(mutating: alpha) as UnsafeMutablePointer<vImagePixelCount>?

Что теперь я получаю предупреждение:

Инициализация 'UnsafeMutablePointer' (он же 'UnsafeMutablePointer') приводит к висячему указателю

Подробное предупреждение состоит из:

  1. Неявное преобразование аргумента из '[vImagePixelCount]' (он же 'Array') в 'UnsafePointer' (он же 'UnsafePointer) ') создает указатель, действительный только на время вызова' init (mutating:) '

  2. Используйте метод withUnsafeBufferPointer в Array для явного преобразования аргумента в указатель буфера действительно для определенной области действия

Есть ли способ обойти это?

Ответы [ 2 ]

3 голосов
/ 27 марта 2020

Это никогда не было безопасно, и теперь компилятор предупреждает вас более агрессивно.

let alphaPtr = UnsafeMutablePointer ...

В конце этой строки alphaPtr уже недействительно. Нет никаких обещаний, что он указывает на выделенную память.

Вместо этого вам нужно вложить все необходимое использование в блок withUnsafeMutablePointer() (или withUnsafePointer()). Если вы не можете вложить его в блок (например, если вы храните указатель или возвращаете его), то нет способа исправить это. Вам придется изменить дизайн управления данными, чтобы не требовать этого.

0 голосов
/ 27 марта 2020

Нужно ли вам использовать метод withUnsafeBufferPointer из Array как

var alphaPtr: UnsafeBufferPointer = alpha.withUnsafeBufferPointer { $0 }

, эта команда создает необязательный указатель, если вам нужно работать с указанным типом c, если вы используете bindMemory(to:) или другой функция, которая соответствует вашим требованиям.

Иногда используйте &alpha, если вам нужен UnsafeRawPointer в качестве параметра функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...