Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Черный мечник
48 / 49 / 34
Регистрация: 29.12.2012
Сообщений: 445
1

Не выводится сообшения от деструктора для умного указателя

29.06.2015, 19:00. Просмотров 302. Ответов 5
Метки нет (Все метки)

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
#ifndef Shared_ptr_H
#define Shared_ptr_H
template<class T>
class shared_ptr
{
   private:
    struct storage
     { 
        T* pObj;
        int counter;
     };
    storage stor;
   public:
      shared_ptr(T* pObject);
      shared_ptr(shared_ptr& p);
     ~shared_ptr();
     T* ptr();
     T* operator->();
     T& operator* ();
     T* operator=(shared_ptr & rhs);
     bool itNull();
};
 
template<class T>
shared_ptr<T>::shared_ptr(T* pObject)
   {  
     stor.counter=1;
     stor.pObj=pObject;
     cout<<"Конструктор==="<<stor.counter<<endl;
   }
 
template<class T>
shared_ptr<T>::shared_ptr(shared_ptr& p)
   {
 
       cout<<"Конструктор-копий\n";  
       stor.pObj = p.stor.pObj;
       stor.counter =p.stor.counter;
       ++stor.counter;
           cout<<"counter="<< stor.counter<<endl;
   }
 
template<class T>
shared_ptr<T>::~shared_ptr()
   {
        cout<<"Деструктор==="<<stor.counter<<endl;
       --stor.counter;
           if(!stor.counter)
            {
               cout<<"Деструктор shared_ptr(куча)\n";
               delete stor.pObj;
            }
           else
            {
               cout<<"Деструктор shared_ptr(counter--)\n";
            }
           
   }
 
template<class T>
T* shared_ptr<T>::ptr()
   {
     return stor.pObj;
   }
 
template<class T>
T* shared_ptr<T>::operator->()
   {
     return stor.pObj;
   }
 
template<class T>
T& shared_ptr<T>::operator*()
   { 
     return *(stor.pObj); 
   }
 
template<class T>
T*  shared_ptr<T>::operator=(shared_ptr & rhs)
   { 
     if(this!=& rhs)
         {
            cout<<"operator="<<stor.counter<<endl;
            delete stor.pObj;
                 stor.pObj=rhs.stor.pObj;
                 stor.counter =rhs.stor.counter;
                 ++stor.counter;
                 return stor.pObj;          
         }
       return stor.pObj;
   }
 
template<class T>
bool shared_ptr<T>::itNull()
   { 
     return (!stor.pObj);
   }  
#endif 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
24
25
26
27
28
29
30
31
32
33
34
//main.cpp
#include<iostream>
 
#include "Shared_ptr.h"
#include "List.h"
 
using namespace std;
 
void f_shared_ptr();
 
int main()
{
    setlocale(LC_ALL,"Rus");
    //f_scoped_ptr();
    //f_auto_ptr();
    f_shared_ptr();
    system("pause");
    return 0;
}
void f_shared_ptr()
{/*
    shared_ptr<int> pInt=new int(3);
    shared_ptr<int> pInt1(pInt); 
                       cout<<"(pInt)Проверка на Null="<<pInt.itNull()<<endl;
                       cout<<"(pInt)Проверка на ptr()="<<pInt.ptr()<<":::"<<*(pInt.ptr())<<endl;
                       cout<<"(pInt1)Проверка на ptr()="<<pInt1.ptr()<<":::"<<*(pInt1.ptr())<<endl;*/
 
     shared_ptr<int> pInt3=new int(3);
     shared_ptr<int> pInt4=new int(6);
     cout<<"(pInt4)Проверка на ptr()="<<pInt4.ptr()<<":::"<<*(pInt4.ptr())<<endl;
     pInt4=pInt3; 
      cout<<"(pInt4)Проверка на ptr()="<<pInt4.ptr()<<":::"<<*(pInt4.ptr())<<endl;
      cout<<"(pInt3)Проверка на ptr()="<<pInt3.ptr()<<":::"<<*(pInt3.ptr())<<endl;
}
Невыводится сообшения от деструктора что обьект удален из-за этого я думаю что утечка...
Конкретно этот участок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class T>
T*  shared_ptr<T>::operator=(shared_ptr & rhs)
   { 
     if(this!=& rhs)
         {
            cout<<"operator="<<stor.counter<<endl;
            delete stor.pObj; //вот тут должно произойти удаление
                 stor.pObj=rhs.stor.pObj;
                 stor.counter =rhs.stor.counter;
                 ++stor.counter;
                 return stor.pObj;          
         }
       return stor.pObj;
   }
каких то других отклонений вработе программы я не увидил...

Добавлено через 22 минуты
Блин я понял ошибки нет я вызываю,деструктор обькта (в этом случае int)?я провильно понял что утечки нет?

Добавлено через 55 секунд
Я проверил с листом,и вызвался деструктор листа в том месте...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2015, 19:00
Ответы с готовыми решениями:

Реализация умного указателя
Добрый вечер. Сегодня с умным указателем поиграться. Написал обгортку : #pragma once template...

Доступ к полю умного указателя
Привет. Реализовал умный указатель. Появилась проблема: Если обращаться через перегруженный...

Проверить правильность реализации умного указателя
? template&lt;class T&gt; class Auto_Ptr { public: Auto_Ptr(); explicit Auto_Ptr(T* alloc);...

Передача умного указателя в функцию принимающую указатель на указатель
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); ...

Вызов деструктора для копии
вопрос в комментариях #include &lt;iostream&gt; #include &lt;iterator&gt; #include &lt;algorithm&gt; #include...

5
Perfilov
264 / 164 / 56
Регистрация: 25.02.2015
Сообщений: 435
29.06.2015, 21:00 2
может и есть, а может и нет. сам шаред поинтер кривой.
вы в конструкторе копирования не наращиваете вчетчик, а в операторе = идет безусловное удаление.
и stor у вас как значение, а должно быть динамически создано и все шаред поинтеры, которые владеют
одним и тем же объектом должны иметь одинаковый указатель на stor
0
Черный мечник
48 / 49 / 34
Регистрация: 29.12.2012
Сообщений: 445
29.06.2015, 23:02  [ТС] 3
Perfilov,
Цитата Сообщение от Perfilov Посмотреть сообщение
может и есть, а может и нет. сам шаред поинтер кривой.
согласен
Цитата Сообщение от Perfilov Посмотреть сообщение
вы в конструкторе копирования не наращиваете вчетчик
39 строка нарашивание
Цитата Сообщение от Perfilov Посмотреть сообщение
в операторе = идет безусловное удаление
ну это надо смотреть, хотя если посмотреть на тему то меня это и смутило, то что в деструктор Shared_ptr не заходил, а сразу удалял обькт что в свою очередь призвело на отсуствие проверок на наличее еше указателей на этот обьект
Цитата Сообщение от Perfilov Посмотреть сообщение
а должно быть динамически создано и все шаред поинтеры, которые владеют
одним и тем же объектом должны иметь одинаковый указатель на stor
ну для этого мне нужен лвл ап прошлый раз я несмог написать его(из-за внутрений структуры),и вообше тема мутная надо много еше думать и узнавать...
0
Renji
2114 / 1552 / 473
Регистрация: 05.06.2014
Сообщений: 4,505
29.06.2015, 23:58 4
Для начала:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class shared_ptr
{
    void*pointer;
    int*count;
public:
    shared_ptr(void*_pointer):pointer(_pointer),count(new int(1)){}
    shared_ptr(const shared_ptr&src):pointer(src.pointer),count(src.count){++*count;}
    ~shared_ptr(){
        if(!--*count)
        {
            delete count;
            delete pointer;
        }
   }
};
А не как у вас - у всех своя копия stor.
0
Черный мечник
48 / 49 / 34
Регистрация: 29.12.2012
Сообщений: 445
30.06.2015, 00:43  [ТС] 5
Renji,
C++
1
 void*
я такое видел только раз, когда malloc разбирал
и мне хотелось со структурой внутри(так сказать маленький служебный клас),а что такое было полегче сделать
0
Perfilov
264 / 164 / 56
Регистрация: 25.02.2015
Сообщений: 435
30.06.2015, 02:33 6
кот корректный код для корректного шаред поинтера. но с вашим он падает:
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
struct Tracer
{
  int m_value;
 
  Tracer(int value)
    : m_value(0)
  {
  }
 
  ~Tracer()
  {
    std::cout << "Dtor of " << this << std::endl;
  }
 
  void Foo()
  {
    m_value += 1;
    std::cout << "this = " << this << "  value = " << m_value << std::endl;
  }
};
 
int main()
{
  typedef shared_ptr<Tracer> SharedTracer;
 
  {
    Tracer* shared = new Tracer(666);
    SharedTracer* p1 = new SharedTracer(shared);
    {
      SharedTracer p2(*p1);
      p2.ptr()->Foo();
      p1->ptr()->Foo();
      delete p1;
      p2.ptr()->Foo(); // упс. хотя должно работать, ведь p2 должно держать объект и не позволять его удалять в p1
    }
  }
 
  return 0;
}
0
30.06.2015, 02:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2015, 02:33

Вызов деструктора для класса в векторе
Уважаемые знатоки, подскажите по-поводу деструктора класса, а то я совсем запутался вот в такой...

Повторный вызов деструктора для объекта
Здравствуйте! К сожалению, я пока не умею пользоваться отладчиком для анализа работы программ,...

Ошибка умного указателя для формы
Приветствую. В хедере главной форме объявляю умный указатель на вторую форму: private: // User...


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

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

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