Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
шКодер самоучка
 Аватар для Max Dark
2282 / 1958 / 945
Регистрация: 09.10.2013
Сообщений: 4,388
Записей в блоге: 3
1

Использование enable_shared_from_this совместно с custom deleter

14.09.2023, 23:16. Показов 1465. Ответов 3

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

У std::sharde_ptr есть возможность указать пользовательский deleter.

Так же есть std::enable_shared_from_this.

Возникли вопросы:
  • Будет ли использоваться custom deleter после использования shared_form_this?
  • Безопасно ли их совместное условие?
  • Почему такой ответ?

Предполагаемое использование:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// interface.hxx
 
#include <memory>
 
struct A
{
    using ptr = std::shared_ptr<A>;
 
    static ptr create();
    virtual ptr demo() = 0;
 
protected:
    static void destroy(A* a);
    virtual ~A();
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// interface.cxx
 
#include "interface.hxx"
 
struct B: A, std::enable_from_this()
{
    ptr demo() override
    {
        return shared_from_this(); // <<< Is it safe??
    }
 
};
 
A::~A() = default;
 
A::ptr A::create() { return {new B, &A::destroy}; }
 
void A::destroy(A* a)
{
    // some cleanup code
 
    delete a;
}
Я хочу использовать эту связку, чтобы возвращать shared_ptr из dll и и при этом для создания/удаления использовался аллокатор из этой же dll
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.09.2023, 23:16
Ответы с готовыми решениями:

Custom deleter умного указателя
Нужен ли custom deleter в данном случае? Если да, то как его реализовать? Стандарт c++11 Заранее...

Использование if совместно с case
Добрейшего времени бытия, товарищи! У меня возник вот такой вопрос:&quot;Можно ли сделать IF по...

Использование DDR3 совместно с DDR3L
Приветствую. Купил dd3l, дома выяснилось, что в asus k55d стоят 2 плашки ddr3. Вставлял совместно и...

Использование TOP и GROUP BY совместно
Мне нужно получить по одной записи из каждой группы в таблице. Например, А Б В 1 2 3...

Использование нескольких языков совместно с C#
Ребята, я слышал что в С# можно использовать несколько языков, что например можно часть кода...

3
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
15.09.2023, 00:27 2
Max Dark, безотносительно вопроса, сама по себе идея возвращать shared_ptr из dll крайне спорная. Хотя бы потому, что проблема, которую вы решаете с помощью custom deleter`а, никуда не денется, а просто перейдет на уровень самого shared_ptr - аллокация счетчика будет подвержена ей. К тому же layout shared_ptr скорее всего не будет переносим между разными компиляторами.

Поэтому совет: для стабильной работы в DLL, ничего лучше COM-like класса с внутренним счетчиком ссылок и inline обертки a-la intrusive_ptr не придумано.
2
шКодер самоучка
 Аватар для Max Dark
2282 / 1958 / 945
Регистрация: 09.10.2013
Сообщений: 4,388
Записей в блоге: 3
15.09.2023, 00:59  [ТС] 3
DrOffset, предполагается, что будет использоваться один и тот же компилятор для всех модулей.
Основная причина наличия таких модулей - загрузка по необходимости.

Добавлено через 7 минут
DrOffset, аллокация control block как я понимаю так же будет происходить на стороне DLL, так как A::ptr A::create() { return {new B, &A::destroy}; } будет внутри библиотеки.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
15.09.2023, 09:57 4
Цитата Сообщение от Max Dark Посмотреть сообщение
аллокация control block как я понимаю так же будет происходить на стороне DLL
А деаллокация? Реализация может конечно ее предусматривать в правильном месте, но гарантий никаких нет.
Так что я бы на вашем месте отказался от share_ptr для использования с объектами в dll.
Заодно и вопрос ваш про enable_form_this решится сам собой, для интрузивных счетчиков нет этой проблемы.
Весь контроль за местом освобождения объекта будет полностью в ваших руках.

Добавлено через 27 минут
Max Dark,
Кликните здесь для просмотра всего текста
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <cassert>
#include <utility>
 
class IRefCnt
{
public:
    virtual void addRef() = 0;
    virtual void remRef() = 0;
};
 
template <typename IObj>
class RefCnt : public IObj
{
protected:
    RefCnt() : m_refCnt()
    {}
 
    void addRef() override
    {
        ++m_refCnt;
    }
    void remRef() override
    {
        if(--m_refCnt == 0)
        {
            delete this;
        }
    }
 
private:
    int m_refCnt;
};
 
template <typename IObj>
class RefCntPtr
{
public:
    RefCntPtr(IObj* p = nullptr) : m_ptr(p)
    {
        if(m_ptr) m_ptr->addRef();
    }
    ~RefCntPtr()
    {
        if(m_ptr) m_ptr->remRef();
    }
    RefCntPtr(RefCntPtr const& other) : m_ptr(other.m_ptr)
    {
        if(m_ptr) m_ptr->addRef();
    }
    RefCntPtr& operator=(RefCntPtr const& other)
    {
        if(this != &other)
            RefCntPtr(other).swap(*this);
        return *this;
    }
    void swap(RefCntPtr& other)
    {
        std::swap(m_ptr, other.m_ptr);
    }
 
    IObj* operator->()
    {
        assert(m_ptr != nullptr);
        return m_ptr;
    }
    
private:
    IObj* m_ptr;
};
 
class ISomeDll;
 
extern "C" ISomeDll* createSomeDll();
 
class ISomeDll : public IRefCnt
{
public:
    using IPtr = RefCntPtr<ISomeDll>;
 
    IPtr demo() // NVI
    {
        return IPtr( this );
    }
    static IPtr create()
    {
        return IPtr( createSomeDll() );
    }
 
    virtual void test() = 0;
 
protected:
    virtual ~ISomeDll() = default;
};
 
//........................
// cpp
#include <iostream>
 
class SomeDll : RefCnt<ISomeDll>
{
    friend ISomeDll* createSomeDll();
public:
    void test() override
    {
        std::cout << "SomeDll::test\n";
    }
    ~SomeDll()
    {
        std::cout << "SomeDll destroyed\n";
    }
};
 
ISomeDll* createSomeDll()
{
    return new(std::nothrow) SomeDll();
}
 
int main()
{
    ISomeDll::IPtr p = ISomeDll::create();
 
    p->test();
 
    ISomeDll::IPtr p1 = p->demo();
 
    p1->test();
}
https://wandbox.org/permlink/Z01yFAWrllC6GRTE
2
15.09.2023, 09:57
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.09.2023, 09:57
Помогаю со студенческими работами здесь

Использование Entity Framework совместно с SQLite
Подскажите пожалуйста как совместить их? Только при создании БД из графического интерфейса (через...

Использование VB или VB .NET совместно с IIS
В указанных программах есть поддержка для упрощенного написания ASP скриптов из этих оболочек....

Использование Java-кода совместно с Joomla, например
Всем привет. Есть код, написанный на облаке SalesForce. В этом облаке получается логика пишется на...

Использование совместно паттернов Builder и Abstract Factory
Добрый день. При изучении паттернов возникла идя написать программу моделирующую процесс...

Использование onClick совместно с оператором if, android studio
У меня есть несколько методов onClick, которые изменяют содержимое spinner'a внутри одного...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Проектирование и моделирование
hw_wired 28.01.2025
Введение в моделирование Моделирование представляет собой один из фундаментальных методов научного познания, который позволяет изучать объекты и явления через создание их упрощенных аналогов. В. . .
Алгоритмы и исполнители
hw_wired 28.01.2025
Введение в алгоритмы В современном мире информационных технологий алгоритмы играют основополагающую роль в решении различных задач и автоматизации процессов. Алгоритм представляет собой точную. . .
Хранение информации
hw_wired 28.01.2025
Введение: Роль систем хранения информации в современном мире В современную эпоху цифровых технологий эффективное хранение информации становится одним из ключевых факторов успешного развития любой. . .
Обработка числовой информации
hw_wired 28.01.2025
Введение в обработку числовой информации В современном мире обработка числовой информации стала неотъемлемой частью как профессиональной деятельности, так и повседневной жизни. Электронные таблицы. . .
Мультимедиа
hw_wired 28.01.2025
Введение в мультимедийные технологии В современном мире мультимедийные технологии стали неотъемлемой частью нашей жизни, проникнув во все сферы человеческой деятельности. Термин "мультимедиа". . .
Обработка текстовой информации
hw_wired 28.01.2025
Введение в обработку текстовой информации В современном мире обработка текстовой информации играет фундаментальную роль в различных сферах человеческой деятельности. Текстовые редакторы стали. . .
Обработка графической информации
hw_wired 28.01.2025
Введение в компьютерную графику Компьютерная графика стала неотъемлемой частью современного цифрового мира, пройдя впечатляющий путь развития от простейших черно-белых изображений до сложных. . .
Python в Алгоритмике: Решение задач
hw_wired 28.01.2025
Введение в Python и Алгоритмику В современном мире программирование стало неотъемлемой частью образования и профессионального развития. Python зарекомендовал себя как один из самых популярных и. . .
Компьютер как универсальное устройство для работы с информацией
hw_wired 28.01.2025
Введение в устройство компьютера Компьютер представляет собой универсальное электронное устройство, предназначенное для автоматической обработки информации. В современном мире компьютер стал. . .
Информация и информационные процессы
hw_wired 28.01.2025
Понятие информации и ее виды В современном мире информация является одним из фундаментальных понятий, пронизывающих все сферы человеческой деятельности. Под информацией понимают любые сведения об. . .
Алгоритмика
hw_wired 28.01.2025
Введение: Основы алгоритмики и её роль в информатике В современном мире программирование и алгоритмическое мышление стали неотъемлемой частью образования и профессиональной деятельности. . . .
Информационное моделирование
hw_wired 28.01.2025
Введение в информационное моделирование В современном мире информационное моделирование стало неотъемлемой частью научной, образовательной и профессиональной деятельности. Это мощный инструмент. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru