Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238

reference counter в shared_ptr

19.08.2020, 13:20. Показов 2544. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как реализован reference counter в shared_ptr? Я так понимаю там должен быть целый клас, а в самом shared_ptr должен хранится указатель на переменную класа ref_count? Или есть другие варинаты как реализовать это?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.08.2020, 13:20
Ответы с готовыми решениями:

Ошибки underfined reference to parentClass::method и unerfined reference to vtable при линковке
При сборке компилятор выдает ошибки underfined reference to и unerfined reference to vtable. Есть базовый класс, два наследуемых от него и...

C++ 11 shared_ptr
Есть вопрос из теста You have some code that creates a HardwareContext object representing a hardware resource. You need to do some...

Shared_ptr
Всем хай. Есть некий класс и в нём такой метод: class Base { public: std::shared_ptr<Base> get_ptr() { ...

21
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
19.08.2020, 13:24
Лучший ответ Сообщение было отмечено Vanconts как решение

Решение

Цитата Сообщение от Vanconts Посмотреть сообщение
Как реализован reference counter в shared_ptr?
https://stackoverflow.com/ques... mplemented
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
19.08.2020, 13:59  [ТС]
GbaLog-,
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
template<class T>
class shared_ptr
{
    struct aux
    {
        unsigned count;
 
        aux() :count(1) {}
        virtual void destroy()=0;
        virtual ~aux() {} //must be polymorphic
    };
 
    template<class U, class Deleter>
    struct auximpl: public aux
    {
        U* p;
        Deleter d;
 
        auximpl(U* pu, Deleter x) :p(pu), d(x) {}
        virtual void destroy() { d(p); } 
    };
 
    template<class U>
    struct default_deleter
    {
        void operator()(U* p) const { delete p; }
    };
 
    aux* pa;
    T* pt;
 
    void inc() { if(pa) interlocked_inc(pa->count); }
 
    void dec() 
    { 
        if(pa && !interlocked_dec(pa->count)) 
        {  pa->destroy(); delete pa; }
    }
 
public:
 
    shared_ptr() :pa(), pt() {}
 
    template<class U, class Deleter>
    shared_ptr(U* pu, Deleter d) :pa(new auximpl<U,Deleter>(pu,d)), pt(pu) {}
 
    template<class U>
    explicit shared_ptr(U* pu) :pa(new auximpl<U,default_deleter<U> >(pu,default_deleter<U>())), pt(pu) {}
 
    shared_ptr(const shared_ptr& s) :pa(s.pa), pt(s.pt) { inc(); }
 
    template<class U>
    shared_ptr(const shared_ptr<U>& s) :pa(s.pa), pt(s.pt) { inc(); }
 
    ~shared_ptr() { dec(); }
 
    shared_ptr& operator=(const shared_ptr& s)
    {
        if(this!=&s)
        {
            dec();
            pa = s.pa; pt=s.pt;
            inc();
        }        
        return *this;
    }
 
    T* operator->() const { return pt; }
    T& operator*() const { return *pt; }
};

зачем в примере приведенном создается интерфейс(абстрактный клас)? Почему нельзя без него обойтись?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.08.2020, 14:06
Vanconts, можно обойтись, но по сути получится тоже самое, но менее выразительно.

Абстрактный класс используется, чтобы реализовать поддержку type erasure (ссылка).
Потому что далее у нас не фигурируют, "стираются", типы, заданные в конструкторе - Deleter и U.
2
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
19.08.2020, 14:17  [ТС]
DrOffset, впервые встречаю type ensure, можно маленькое описание для чайников?) либо опять таки литературу где можно эб этом почитать (желательно не на 1000 страниц)
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.08.2020, 14:19
Vanconts, описания по ссылке на вики не достаточно?
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
19.08.2020, 14:27  [ТС]
DrOffset, не достаточно
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.08.2020, 14:28
Vanconts, если вкратце, то это переход от статического полиморфизма к динамическому.
На русском есть описание в книге "Шаблоны C++. Справочник разработчика" (2 издание). Глава 22, параграф 22.4. Все 800 страниц книги читать не обязательно (хотя конкретно эта книга должна быть в библиотеке каждого плюсовика)
1
19.08.2020, 14:44

Не по теме:

Кстати что за именование такое "aux" я так понимаю сокращение, кто знает как полностью и смысл?

0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
19.08.2020, 14:47  [ТС]
DrOffset, а что такое собственно статический и динамический полиморфизм?)
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.08.2020, 14:49
Цитата Сообщение от Vanconts Посмотреть сообщение
а что такое собственно статический и динамический полиморфизм?)
А что такое полиморфизм вообще - понимаете?
0
19.08.2020, 14:52

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
"aux"
Сокращение от auxiliary - вспомогательный

0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
19.08.2020, 14:55
Цитата Сообщение от Vanconts Посмотреть сообщение
а что такое собственно статический и динамический полиморфизм?)
Может стоит в руки книгу взять?
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
19.08.2020, 15:27  [ТС]
DrOffset, думаю что да)

Добавлено через 3 минуты
DrOffset, я так понимаю речь идет об этом?
когда при помощи ссылки или указателя на базовый класс происходит вызов функции, определенной в базовом классе, точный тип объекта, для которого будет выполняться функция, неизвестен. Это может быть объект базового класса, а может быть и производного. Если вызываемая функция не виртуальна, независимо от фактического типа объекта, выполнена будет та версия функции, которая определена в базовом классе. Если функция виртуальна, решение о фактически выполняемой версии функции откла­дывается до времени выполнения. Она определяется на основании типа объекта, с которым связана ссылка или указатель.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.08.2020, 15:56
Vanconts, об этом, но не совсем. Это описание процесса, но не сути.

Немного на пальцах, не претендуя на непогрешимую точность формулировок (это дисклеймер для тех, кто любит к ним (формулировкам) придираться):

Динамический полиморфизм в С++ - это полиморфизм объектов. На самом деле все точные типы при таком полиморфизме известны, в С++ вообще не может быть так, чтобы типы были неизвестны. Но вот именно какого типа будет объект, скрывающийся за ссылкой или указателем, действительно может быть намеренно неизвестно на этапе компиляции.

Статический полиморфизм в С++ - это разновидность параметрического полиморфизма, т.к. язык С++ статически типизирован, то по сути это полиморфизм типов. Как понятно из названия, существует он только на этапе компиляции. Динамического полиморфизма типов в С++ не бывает, потому что нет динамических типов. Зато в С++ бывает динамический полиморфизм объектов.

Так вот, идиома type erasure по сути реализует полиморфизм типов через динамический полиморфизм. Делая из него динамический полиморфизм типов.

А надо это затем, что Deleter и U - это изменяющиеся сущности, зависящие от динамического контекста, который задает (может задавать) программист, когда пишет программу. Поэтому в типе shared_ptr их невозможно сохранить, также как при обычном полиморфизме вы не сохраняете в указателе или ссылке на базовый\абстрактный класс тип наследников.
1
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
19.08.2020, 16:08  [ТС]
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
Динамический полиморфизм в С++ - это полиморфизм объектов. На самом деле все точные типы при таком полиморфизме известны, в С++ вообще не может быть так, чтобы типы были неизвестны. Но вот именно какого типа будет объект, скрывающийся за ссылкой или указателем, действительно может быть намеренно неизвестно на этапе компиляции.
тоесть это полиморфизм реализованный с помощью виртуальных функций? Тк не известно какой тип имеет то на что указывает указатель базового класса тоесть тип определяется во время выполнения?
Цитата Сообщение от DrOffset Посмотреть сообщение
Статический полиморфизм в С++ - это разновидность параметрического полиморфизма, т.к. язык С++ статически типизирован, то по сути это полиморфизм типов. Как понятно из названия, существует он только на этапе компиляции. Динамического полиморфизма типов в С++ не бывает, потому что нет динамических типов. Зато в С++ бывает динамический полиморфизм объектов.
это полиморфизм перегрузки функций/операторов и (тут я не уверен) шаблоны
Так?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.08.2020, 16:11
Цитата Сообщение от Vanconts Посмотреть сообщение
тоесть это полиморфизм реализованный с помощью виртуальных функций?
Да.

Цитата Сообщение от Vanconts Посмотреть сообщение
это полиморфизм перегрузки функций/операторов и (тут я не уверен) шаблоны
Да.
1
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
19.08.2020, 22:41  [ТС]
DrOffset, я правильно понял суть? Делаем мы это для того чтобы хранить объект известного нам типа (в данном случае aux) , а во время выполнения уже будет определено то что хранит этот тип( в данном случае тип указателя и функции удаления) , а сделать без абстрактного класса не получится тк в данном случае требовалось бы указать типы указателя и функции напрямую ( к примеру auximlp<t1,t2> var) тоесть этот класс aux что-то по типу обертки созданной для того чтобы можно было хранить его , а он в свою очередь что угодно?
И насколько я понял здесь используется и динамический полиморфизм и статический?

Добавлено через 3 часа 41 минуту
DrOffset, а зачем вообще пихать counter в ту структуру? Нельзя разве создать указатель в самом классе counter и в конструкторе выделять память лдя counter ?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.08.2020, 23:00
Vanconts, в общих чертах - правильно.

Цитата Сообщение от Vanconts Посмотреть сообщение
а зачем вообще пихать counter в ту структуру? Нельзя разве создать указатель в самом классе counter и в конструкторе выделять память лдя counter ?
Можно.
Просто вам уже показали, так сказать, продвинутую реализацию, где помимо счетчика хранится еще и Deleter и оригинальный тип который был передан в конструкторе. Позволяя таким образом вызывать у хранимого объекта правильный деструктор, даже если он не был объявлен виртуальным.
2
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
17.12.2020, 22:38
Цитата Сообщение от DrOffset Посмотреть сообщение
Просто вам уже показали, так сказать, продвинутую реализацию
в коде ни где не используется T* pt, кроме инициализации. Зачем его указали?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.12.2020, 22:38
Помогаю со студенческими работами здесь

Shared_ptr
Есть следующий код: int main() { std::map&lt;std::string, std::shared_ptr&lt;int&gt;&gt; mp; while (true) { add(mp); ...

Наследование от shared_ptr
Добрый день. Подскажите вот какую вещь. Сделал удобный для себя класс для ведения логов. В нем переопределил operator&lt;&lt; след....

Unique() в shared_ptr
Привет. что-то ошибку выдает в функции unique() для shared_ptr. Если написать == 0, то всё норм будет. Но мне то уникальность проверить...

Shared_ptr и TButton
Я приветствую всех. Захотела душа обернуть в смарт-поинтер кнопочку. Делаю так и получаю изумительный AV на мейк_шэред: ...

Реализация shared_ptr
Добрый день. Реализовал shared_ptr(), но если больше 2 перемен он не правильно работает. Что я не правильно делаю и как правильно ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru