Nano Hash - криптовалюты, майнинг, программирование

Автоматическая обработка удаления небезопасной выделенной памяти в Swift

В программе Swift, которая взаимодействует с низкоуровневыми функциями операционной системы, я выделяю «небезопасные» блоки памяти для буферизации данных. Эти блоки хранятся в struct, которые можно передавать по различным частям программы. Как я могу отследить эти копии и обеспечить освобождение блока памяти после завершения всех копий?

Пример кода:

struct Packet {
    var memoryBlock : UnsafeRawPointer
    init () {
        let block = UnsafeMutableRawPointer.allocate (bytes: 128, alignedTo: 4)
        someProcessThatFillsTheBuffer (block); 
        memoryBlock = UnsafeRawPointer(block);
    }
}

let packet = Packet()
process1.handle (packet); process2.handle (packet)

Как я могу гарантировать, что выделенный блок будет удален после того, как процесс 1 и процесс 2 закончат с ним?

В C++ я бы использовал shared_ptr для отслеживания распределения. Есть ли у Swift что-то подобное, что я могу использовать для этого? Какой-то способ использовать существующую систему ARC для этого?


Ответы:


1

Вместо этого вы можете определить class и освободить память в deinit:

class Packet {
    var memoryBlock : UnsafeRawPointer
    init() {
        let block = UnsafeMutableRawPointer.allocate(byteCount: 128, alignment: 4)
        //someProcessThatFillsTheBuffer (block);
        memoryBlock = UnsafeRawPointer(block);
    }

    deinit {
        memoryBlock.deallocate()
    }
}

Теперь экземпляры Packet являются ссылками на объект и могут передаваться. ARC (автоматический подсчет ссылок) гарантирует, что deinit будет вызываться, когда исчезнет последняя ссылка на объект.

18.07.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..