Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
dimanazer
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
#1

Реализация shared_ptr - C++

17.04.2016, 11:24. Просмотров 1387. Ответов 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 (C++):

Shared_ptr собственная реализация - C++
Здравствуйте, написал собственную реалицацию &quot;умных&quot; указателей для класса object. Прежде чем попробовать написать шаблонную версию хочу...

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

Shared_ptr - C++
Всем хай. Есть некий класс и в нём такой метод: class Base { public: std::shared_ptr&lt;Base&gt; get_ptr() { ...

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

shared_ptr и vector - C++
почему в vector нельзя засунуть shared_ptr ? ...

Allocator и shared_ptr - C++
Прокомментируйте пожалуйста. Есть ли смысл и вообще возможность оформлять зарезервированную память allocator-ом в shared_ptr? Или это...

9
warhast
19 / 19 / 4
Регистрация: 02.02.2014
Сообщений: 74
17.04.2016, 11:35 #2
Счетчик ссылок тоже неплохо бы разделяемым делать, а не в экземпляр указателя пихать.
0
dimanazer
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
17.04.2016, 19:35  [ТС] #3
warhast, не совсем понял. Можете пример навести?
0
Apostol584
241 / 147 / 73
Регистрация: 26.11.2012
Сообщений: 375
Завершенные тесты: 2
18.04.2016, 05:51 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
сделать счетчик ссылок общим, для одинаковых объектов.
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
241 / 147 / 73
Регистрация: 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
241 / 147 / 73
Регистрация: 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
241 / 147 / 73
Регистрация: 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 - C++
Спасибо что зашли в эту тему и уделили мне время. Недавно увидел статью (не реклама) http://habrahabr.ru/post/191018/ Есть такой...

This для shared_ptr - C++
Как создать объект shared_ptr, в котором будет лежать this?

shared_ptr валится - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; #include &quot;boost/shared_ptr.hpp&quot; class One { public: ...

shared_ptr с потомками - C++
Добрый вечер, сейчас столкнулся с задачей хранить большие объемы динамически-выделенной памяти. Обычный массив Base* list не подходит, т.к....


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

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

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