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

Shared_ptr собственная реализация

26.08.2013, 15:27. Показов 23732. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, написал собственную реалицацию "умных" указателей для класса object. Прежде чем попробовать написать шаблонную версию хочу удостовериться, что нет утечек памяти и прочих ошибок. Буду благодарен за всевозможную критику. Заранее спасибо.

shared_ptr.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef SHARED_PTR_H
#define SHARED_PTR_H
 
#include<iostream>
 
class object
{
    int smth;
};
 
class shared_ptr
{
    object* pObj;
    static int count; //счетчик указателей на pObj
public:
    shared_ptr(object* myObj);
    shared_ptr(const shared_ptr &myObj);
    ~shared_ptr();
    shared_ptr& operator=(shared_ptr &myObj);
};
 
 
#endif


shared_ptr.cpp
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
#include"shared_ptr.h"
 
int shared_ptr::count=0;
 
shared_ptr::shared_ptr(object* myObj)
{
    pObj=myObj; 
};
shared_ptr::shared_ptr(const shared_ptr &myObj)
{
    shared_ptr p1 = new object();
    p1.pObj = myObj.pObj;
    count++;
};
 
shared_ptr::~shared_ptr()
{
    if(count==1)//если имеется только один указатель на объект, то чистим память
    {
        delete pObj;
        count = 0;
        printf("Another crash\n");
    }
    else 
        pObj = NULL;
        count--;
};
 
shared_ptr& shared_ptr::operator=(shared_ptr &myObj)
{
    count++;
    return myObj;
}


main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
#include"shared_ptr.h"
using namespace std;
 
void foo(shared_ptr ob)
{
    shared_ptr ob2=ob;
}
 
int main()
{
    shared_ptr p1=new object();
    shared_ptr p2 = p1;
    foo(p2);
    
    return 0;
}
Вложения
Тип файла: rar shared_ptr.rar (874 байт, 25 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.08.2013, 15:27
Ответы с готовыми решениями:

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

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

Собственная реализация функции конкатенации
Вопрос в комментарии к коду. Объясните пожалуйста (см. ниже что именно) #include &lt;stdio.h&gt; void strсat(char *s1, char *s2) ...

11
погромист
 Аватар для coloc
415 / 251 / 30
Регистрация: 27.08.2012
Сообщений: 550
26.08.2013, 15:30
imamatory, первая критика: напишите код на форуме, качать влом Да и удобнее прямо с форума читать.
0
1 / 1 / 1
Регистрация: 25.11.2011
Сообщений: 11
26.08.2013, 15:54  [ТС]
уже за меня сделали)
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
26.08.2013, 15:59
Общий счетчик на все экземпляры класса... Или я чего-то не понимаю в этой жизни.
1
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
26.08.2013, 16:03
imamatory, надо считать сколько имеется ссылок на один объект класса; вообще странный код, я логики не вижу.
1
1 / 1 / 1
Регистрация: 25.11.2011
Сообщений: 11
26.08.2013, 16:06  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Общий счетчик на все экземпляры класса
Да, не продумал. А как можно решить данную проблему?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
26.08.2013, 16:33
Странный вопрос, при условии что вы написали этот класс..
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
26.08.2013, 16:42
Цитата Сообщение от imamatory Посмотреть сообщение
как можно решить данную проблему?
Хранить указатель на объект и счётчик отдельно от объекта shared_ptr, shared_ptr будет ссылаться на них.
2
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
26.08.2013, 20:04
Вот одна тормознутая реализация:
http://ideone.com/ztKaAd
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
26.08.2013, 20:10
Поучаствую) http://ideone.com/J3YYC4
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
26.08.2013, 20:17
Счетчик в идеальном случае должен быть атомарным.
1
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
27.08.2013, 20:25
и я попробую: http://ideone.com/6n1jFV
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.08.2013, 20:25
Помогаю со студенческими работами здесь

Собственная реализация стека. Критика
Покритикуйте пожалуйста реализацию. Самому мне не очень нравится момент с завершением работы программы в catch блоке, но не знаю как обойти...

Шаблонный класс list, собственная реализация
Привет всем. Я по чуть-чуть пишу шаблонный класс list с добавлением элементов в начало списка. Уже на свой страх и риск реализовал три...

Собственная реализация strtok, стоит ли применить статическую переменную?
Добрый день! Пришла мысль реализовать свою strtok. Хотел проконсультироваться. Следует ли в этой strtok применять статическую...

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

Собственная реализация паттерна "Слушатель" - нужна конструктивная критика
Добрый день, наворотил код по работе с паттерном слушатель - есть класс контейнер данных и при их изменении всех кто подписался должен...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru