Задать вопрос
Dyikot
@Dyikot

Как правильно реализовать блок памяти для сильной и слабой ссылки?

На данный момент у меня реализован блок только под сильную ссылку. Но хотелось бы добавить возможность слабой ссылки.
struct RefMemoryBlockBase
{
    std::atomic<size_t> References = 1;
    virtual ~RefMemoryBlockBase() = default;
};

template<typename T>
struct RefMemoryBlock : RefMemoryBlockBase
{
    T Value;

    template<typename... TArgs>
    RefMemoryBlock(TArgs&&... args)
        : Value(std::forward<TArgs>(args)...)
    {}
};

Очевидно для это нужен еще один счетчик под них. Но вот проблема как удалять Value если есть слабые ссылки? При это я не хочу выделять динамически значение вне блока. Если вызывать десктрутор Value, то получается будет вызыватся он дважды. Есть ли какой-то вариант?
  • Вопрос задан
  • 121 просмотр
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Skillbox
    Профессия Разработчик С++
 с нуля + ИИ
    7 месяцев
    Далее
  • Бруноям
    Разработчик на C++
    5 месяцев
    Далее
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Тут есть два варианта: 1) вы вызываете деструктор, но не освобождаете память, когда все сильные ссылки кончились. В этом случае надо воспользоваться type erasure, чтобы выключить деструктор. Деструктор же вы вызываете вручную, когда надо, через reinterpret_cast(storage_)->~T(); Посмотрите вот тут пример: https://chromium.googlesource.com/chromium/src/bas...
2) Вы вызываете деструктор и освобождаете память. В этом случае Value обязано быть в другом блоке памяти, а в вашем умном указателе будет лишь указатель на него. Ибо нельзя никак вернуть часть блока.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы