Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
dimanazer
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
1

Реализация shared_ptr

17.04.2016, 11:24. Просмотров 1728. Ответов 9
Метки нет (Все метки)

Добрый день. Реализовал shared_ptr(), но если больше 2 перемен он не правильно работает.
Что я не правильно делаю и как правильно реализовать если больше 2 перемен
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
namespace pn
{
    template <typename T>
    class shared_ptr
    {
    public:
        shared_ptr()
            : mPtr(nullptr)
            , mCount(0)
        {
        }
        shared_ptr(T* ptr)
            : mPtr(ptr)
            , mCount(1)
        {
        }
        shared_ptr(shared_ptr<T>& other)
            : mPtr(other.mPtr)
            , mCount(other.mCount)
        {
            ++mCount;
            ++other.mCount;
        }
        shared_ptr<T>& operator= (shared_ptr<T>& other)
        { 
            if (this != &other)
            {
                reset();
 
                mPtr = other.mPtr;
                mCount = other.mCount;
                ++mCount;
                ++other.mCount;
            }
            return *this;
        }
        ~shared_ptr()
        {
            reset();
        }
        unsigned use_count() const
        {
            return mCount;
        }
        bool unique() const
        {
            return (mCount == 1);
        }
        void reset()
        {
            if (mCount > 0)
                --mCount;
            if (mCount == 0)
                delete mPtr;
        }
 
    private:
        T* mPtr;
        unsigned mCount;
    };
}
 
 
int main()
{
    pn::shared_ptr<int> p1(new int(9));
    std::cout << "p1.use_count " << p1.use_count() << "\n";
    std::cout << "p1.unique " << p1.unique() << "\n";
 
    pn::shared_ptr<int> p2(p1);
    std::cout << "p2.use_count " << p2.use_count() << "\n";
    std::cout << "p2.unique " << p2.unique() << "\n";
 
    std::cout << "p1.use_count " << p1.use_count() << "\n";
    std::cout << "p1.unique " << p1.unique() << "\n";
 
    pn::shared_ptr<int> p3(p2);
    std::cout << "p1.use_count " << p1.use_count() << "\n";
    std::cout << "p1.unique " << p1.unique() << "\n";
 
    std::cout << "p2.use_count " << p2.use_count() << "\n";
    std::cout << "p2.unique " << p2.unique() << "\n";
 
    std::cout << "p3.use_count " << p3.use_count() << "\n";
    std::cout << "p3.unique " << p3.unique() << "\n";
 
    std::system("PAUSE");
    return 0;
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2016, 11:24
Ответы с готовыми решениями:

Shared_ptr собственная реализация
Здравствуйте, написал собственную реалицацию &quot;умных&quot; указателей для класса...

shared_ptr и реализация семантики переноса
Написал небольшой класс Array основанный на std::shared_ptr. Но как то не...

Shared_ptr
Всем хай. Есть некий класс и в нём такой метод: class Base { public:...

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

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

9
warhast
20 / 20 / 4
Регистрация: 02.02.2014
Сообщений: 75
17.04.2016, 11:35 2
Счетчик ссылок тоже неплохо бы разделяемым делать, а не в экземпляр указателя пихать.
0
dimanazer
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
17.04.2016, 19:35  [ТС] 3
warhast, не совсем понял. Можете пример навести?
0
Apostol584
242 / 148 / 118
Регистрация: 26.11.2012
Сообщений: 375
Завершенные тесты: 2
18.04.2016, 05:51 4
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

сделать счетчик ссылок общим, для одинаковых объектов.
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
#include <iostream>
template <typename T>
class shared_ptr {
public:
    shared_ptr();
    shared_ptr(T* ptr);
    shared_ptr(shared_ptr<T>& other);
    shared_ptr<T> operator= (shared_ptr<T>& other);
    ~shared_ptr();
    size_t use_count() const;
    bool unique() const;
private:
    T* ptr;
    size_t *count;
};
 
template<typename T>
shared_ptr<T>::shared_ptr():ptr(nullptr), count(nullptr){}
 
template<typename T>
shared_ptr<T>::shared_ptr(T * ptr): ptr(ptr), count(new size_t(1)){}
 
template<typename T>
shared_ptr<T>::shared_ptr(shared_ptr<T>& other) : count(other.count), ptr(other.ptr) { 
    (*count)++; 
}
 
template<typename T>
shared_ptr<T> shared_ptr<T>::operator=(shared_ptr<T>& other){
    if (this != &other) {
        if (count) {
            if (*count == 1) {
                delete count;
                delete ptr;
            }
            else (*count)--;
        }
 
        ptr = other.ptr;
        count = other.count;
        (*count)++;
    }
    return *this;
}
 
template<typename T>
shared_ptr<T>::~shared_ptr(){
    if (count) {
        if (*count == 1) {
            delete count;
            delete ptr;
        }
        else (*count)--;
    }
}
 
template<typename T>
size_t shared_ptr<T>::use_count() const{
    return (count) ? *count : 0;
}
 
template<typename T>
bool shared_ptr<T>::unique() const{
    return (*count == 1);
}
 
 
int main() {
    shared_ptr<int> p1(new int(9));
    std::cout << "p1.use_count " << p1.use_count() << "\n";
    std::cout << "p1.unique " << ((p1.unique()) ? "true" : "false") << "\n\n";
 
    shared_ptr<int> p2(new int(10));
    std::cout << "p2.use_count " << p2.use_count() << "\n";
    std::cout << "p2.unique " << ((p2.unique()) ? "true" : "false") << "\n\n";
 
    std::cout << "===================\n";
    shared_ptr<int> p3(p1);
    std::cout << "p1.use_count " << p1.use_count() << "\n";
    std::cout << "p1.unique " << ((p1.unique()) ? "true" : "false") << "\n\n";
 
    std::cout << "p2.use_count " << p2.use_count() << "\n";
    std::cout << "p2.unique " << ((p2.unique()) ? "true" : "false") << "\n\n";
 
    std::cout << "p3.use_count " << p3.use_count() << "\n";
    std::cout << "p3.unique " << ((p3.unique()) ? "true" : "false") << "\n\n";
 
    std::cout << "===================\n";
    p3 = p2; 
    std::cout << "p1.use_count " << p1.use_count() << "\n";
    std::cout << "p1.unique " << ((p1.unique()) ? "true" : "false") << "\n\n";
 
    std::cout << "p2.use_count " << p2.use_count() << "\n";
    std::cout << "p2.unique " << ((p2.unique()) ? "true" : "false") << "\n\n";
 
    std::cout << "p3.use_count " << p3.use_count() << "\n";
    std::cout << "p3.unique " << ((p3.unique()) ? "true" : "false") << "\n\n";
    std::system("PAUSE");
    return 0;
}
0
dimanazer
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
18.04.2016, 08:51  [ТС] 5
Apostol584, спасибо. а как это по другому написать?
C++
1
return (count) ? *count : 0;
, так как я не понял что оно значит.

Добавлено через 19 минут
Apostol584, это ж одно и тоже?
C++
1
2
3
4
if (mCount != 0)
                return *mCount;
            else 
                return 0;
0
Apostol584
242 / 148 / 118
Регистрация: 26.11.2012
Сообщений: 375
Завершенные тесты: 2
18.04.2016, 08:57 6
Цитата Сообщение от dimanazer Посмотреть сообщение
Apostol584, это ж одно и тоже?
да, если count будет nullptr, то вернет false.
C++
1
(bool)? true : false;
0
dimanazer
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
18.04.2016, 15:13  [ТС] 7
Apostol584, если написать так
C++
1
2
 pn::shared_ptr<int> p;
    p.unique();
будет креш))
функция unique() не правильна
0
Apostol584
242 / 148 / 118
Регистрация: 26.11.2012
Сообщений: 375
Завершенные тесты: 2
18.04.2016, 15:20 8
это правится легко)))
C++
1
2
3
4
template<typename T>
bool shared_ptr<T>::unique() const {
    return (count)&&(*count == 1);
}
0
dimanazer
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
18.04.2016, 15:47  [ТС] 9
Apostol584, да) я так сделал)
C++
1
2
3
4
bool unique() const
        {
            return (mCount != nullptr) && (*mCount == 1);
        }
Добавлено через 19 минут
Apostol584, так ж можно записать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void reset()
        {
            if (mCount != nullptr)
            {
                if (*mCount == 1)
                {
                    delete mCount;
                    delete mPtr;
                }
                else
                    --(*mCount);
            }
        }
0
Apostol584
242 / 148 / 118
Регистрация: 26.11.2012
Сообщений: 375
Завершенные тесты: 2
18.04.2016, 15:58 10
да, можно
0
18.04.2016, 15:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2016, 15:58

Weak_ptr и shared_ptr
Спасибо что зашли в эту тему и уделили мне время. Недавно увидел статью (не...

Использование shared_ptr
std::shared_ptr&lt;int&gt; sp(new int); sp = 12; std::cout &lt;&lt; sp; ...

Allocator и shared_ptr
Прокомментируйте пожалуйста. Есть ли смысл и вообще возможность оформлять...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru