Форум программистов, компьютерный форум CyberForum.ru

Как проверить правильно ли ты создал дистрактор - C++

Восстановить пароль Регистрация
 
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.09.2012, 21:52     Как проверить правильно ли ты создал дистрактор #1
сабжж ???
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2012, 21:52     Как проверить правильно ли ты создал дистрактор
Посмотрите здесь:

Не могу проверить правильно ли работает программа! C++
C++ Проверить, правильно ли расставлены скобки в выражении
как проверить правильно ли ты создал копи конструктор C++
Дана последовательность слов. Проверить правильно ли в ней записаны буквосочетания жи и ши. C++
C++ Работа со стеком (Необходимо проверить,правильно ли расставлены скобки)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
04.09.2012, 21:54     Как проверить правильно ли ты создал дистрактор #2
Компилируется?
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.09.2012, 21:59  [ТС]     Как проверить правильно ли ты создал дистрактор #3
Цитата Сообщение от John Prick Посмотреть сообщение
Компилируется?
а как же
нет тут вопрос в другом
допустим все компилируется и даже удаляется все или копируется все хорошо но возможно в данном проекте будут использоваться спец кейсы которые будут валить правильность выполнения операций

вот как найти что на всех кейсах будет выполняться что задумалось
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
04.09.2012, 22:02     Как проверить правильно ли ты создал дистрактор #4
unit-тестирование?
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.09.2012, 22:09  [ТС]     Как проверить правильно ли ты создал дистрактор #5
Цитата Сообщение от PSIAlt Посмотреть сообщение
unit-тестирование?
да вы что это же дестрактор ! ваще азы ) я думал есть какой то стандартный эмелемент или буст или из других библиотек который я не знаю показывает какие элементы не удалились и все такое или где мемори лик или какой ниб типа статик анализатор только для мемори лика (фри варный )

Добавлено через 3 минуты
Цитата Сообщение от PSIAlt Посмотреть сообщение
unit-тестирование?
спешел кейсов то не много на самом деле.... раф поитер и раф поитор из дедушкой написанным контейнером... что еще может быть... а ну там кривая копия объекта класса и кривое использование ассаймент оператора
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
04.09.2012, 22:22     Как проверить правильно ли ты создал дистрактор #6
Цитата Сообщение от Leeto Посмотреть сообщение
Как проверить правильно ли ты создал дистрактор
На самом деле наиглупейший вопрос.
Так же можно спросить: "Как проверить, правильно ли я написал программу?". Ответ - проверить результат её выполнения!
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.09.2012, 22:28  [ТС]     Как проверить правильно ли ты создал дистрактор #7
Цитата Сообщение от lazybiz Посмотреть сообщение
На самом деле наиглупейший вопрос.
Так же можно спросить: "Как проверить, правильно ли я написал программу?". Ответ - проверить результат её выполнения!
если ты приравниваешь два этих вопроса то смею тебя огорчить это наиглушей образ мышления


допустим у тебя в подчинении молодые программисты
что ты будешь проверять имплементацию дестрактора, копи конструктора и ассаймент оператора (правило трех короче ) в каждом классе ...

у boost::share_ptr
есть функция которая считает количество ссылок которые не удалены еще (count) по ходу выполнения программы

должно быть что то похожее для моей конкректной цели
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
04.09.2012, 22:40     Как проверить правильно ли ты создал дистрактор #8
Ну тада cppcheck, valgrind
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
04.09.2012, 22:50     Как проверить правильно ли ты создал дистрактор #9
Цитата Сообщение от Leeto Посмотреть сообщение
допустим у тебя в подчинении молодые программисты
что ты будешь проверять имплементацию дестрактора, копи конструктора и ассаймент оператора (правило трех короче ) в каждом классе ...
Unit-тесты. Об этом уже говорили. При чем тут конкретно деструкторы? Если тебя интересует конкретная часть кода, тогда проверяй её сам. Неужели там так много кода, чтобы нельзя было проверить самостоятельно?

Цитата Сообщение от Leeto Посмотреть сообщение
у boost::share_ptr
есть функция которая считает количество ссылок которые не удалены еще (count) по ходу выполнения программы
должно быть что то похожее для моей конкректной цели
Твоя цель размыта и не понятна.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.09.2012, 23:27  [ТС]     Как проверить правильно ли ты создал дистрактор #10
Цитата Сообщение от lazybiz Посмотреть сообщение
Твоя цель размыта и не понятна.
ты забыл добавить что конкретно тебе моя цели размыта и не понятна

Добавлено через 2 минуты
есть такая штука cout << "@";
неужели придется проверять количество вызванных конструкторов релевантных к определенному адрессу памяти и количество вызванных дестракторов ? наверняка же в какой ниб библиотеке эта проверялка написанна

другими словами можно узнать адресс памяти где локализован тот или иной объект...
и типа прописать а ля если объект из данного адресса не удален к концу мейна то вызывается алерт
все же просто...
наверняка это где ниб уже есть в красивом виде



Добавлено через 6 минут
Цитата Сообщение от lazybiz Посмотреть сообщение
При чем тут конкретно деструкторы?
есть такое понятие как динамически созданные объекты внутри другого класса.


расскажи мне как ты их будешь удалять если они привязанну к обычному указателю без мусоросборника ?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
04.09.2012, 23:32     Как проверить правильно ли ты создал дистрактор #11
Цитата Сообщение от Leeto Посмотреть сообщение
ак ты их будешь удалять если они привязанну к обычному указателю без мусоросборника ?
Операцией delete, как все нормальные люди.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
04.09.2012, 23:42     Как проверить правильно ли ты создал дистрактор #12
Цитата Сообщение от Leeto Посмотреть сообщение
ты забыл добавить что конкретно тебе моя цели размыта и не понятна
Это предложение не поддается моему здравому смыслу.

Цитата Сообщение от Leeto Посмотреть сообщение
есть такое понятие как динамически созданные объекты внутри другого класса.
Да, слышал об этом.

Цитата Сообщение от Leeto Посмотреть сообщение
расскажи мне как ты их будешь удалять если они привязанну к обычному указателю без мусоросборника ?
Что ты подразумеваешь под "обычным указателем без мусоросборника" ? Как ты выделял под них память?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.09.2012, 23:48     Как проверить правильно ли ты создал дистрактор #13
Цитата Сообщение от Leeto Посмотреть сообщение
есть такое понятие как динамически созданные объекты внутри другого класса.

расскажи мне как ты их будешь удалять если они привязанну к обычному указателю без мусоросборника ?
Ящитаю, это половые трудности другого класса — удалять свои динамически созданные объекты. Вызвали деструктор — объект должен умереть. Вместе со всем, что он для себя насоздавал.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.09.2012, 23:59  [ТС]     Как проверить правильно ли ты создал дистрактор #14
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ящитаю, это половые трудности другого класса — удалять свои динамически созданные объекты. Вызвали деструктор — объект должен умереть. Вместе со всем, что он для себя насоздавал.

Другими словами если функция / библиотечный элемент, который перед тем как прога завершенно выдает количество мусора которое висит в хипе ???


если еще проще... если что ниб типа того :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "boost/garbage_manager.hpp"/ #include <garbage_manager>
 
int main () 
{
 
... 
... 
... 
 
3 млн лайнов 
 
... 
... 
 
 
 
cout << "show garbage" << std::show_all_garbage / boost::show_all_garbage; 
return 0 ;
}
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
04.09.2012, 23:59     Как проверить правильно ли ты создал дистрактор #15
~OhMyGodSoLong~, я абсолютно с вами согласен.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.09.2012, 00:00     Как проверить правильно ли ты создал дистрактор #16
Цитата Сообщение от Leeto Посмотреть сообщение
Другими словами если функция / библиотечный элемент, который перед тем как прога завершенно выдает количество мусора которое висит в хипе ???
Прогу уже называли: valgrind.

С типами данных вряд ли информацию можно выдать (нет рефлексии), но просто суммарно количество просранной памяти теоретически реально: переопределяете глобальные operator new и operator delete, пусть ведут лог того, сколько выделено и сколько удалено.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
05.09.2012, 00:11  [ТС]     Как проверить правильно ли ты создал дистрактор #17
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Прогу уже называли: valgrind.

С типами данных вряд ли информацию можно выдать (нет рефлексии), но просто суммарно количество просранной памяти теоретически реально: переопределяете глобальные operator new и operator delete, пусть ведут лог того, сколько выделено и сколько удалено.
а как это сдалать??? как обычная перегрузка оператор

C++
1
2
3
4
5
6
7
8
9
10
11
class Anyclass 
{
int unsigned counter = 0; 
public : 
... 
friend void new (/*а куда запихать что это относиться к этого классу... сюда что ли ?*/) 
{
counter ++ ; 
}
 
}
что то типа того ???

И что придется для всех 28 классов такую перегруженную штуку писать ???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2012, 10:44     Как проверить правильно ли ты создал дистрактор
Еще ссылки по теме:

C++ Нужен алгоритм, которым можно проверить, правильно ли пользователь расставил скобки
C++ Проверить, правильно ли в арифметическом выражении расставлены скобки.
C++ Проверить правильно ли расставлены скобки в арифметическом выражении

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.09.2012, 10:44     Как проверить правильно ли ты создал дистрактор #18
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Leeto, Операторы можно и глобально переопределить, но делать я этого не советую. Скорее уж написать аллокатор, который будет за этим следить или класс с перегруженными оператороми new/delete и унаследоваться от него.

Так же сюда можно прикрутить - просмотр выделена память под массив или под простой указатель и т.д.

Почитал стандарт. Т.к. стандартные операторы выглядят так.

C++
1
2
3
4
5
6
7
8
9
10
11
12
void* operator new(std::size_t size);
void* operator new(std::size_t size, const std::nothrow_t&) noexcept;
void operator delete(void* ptr) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;
void* operator new[](std::size_t size);
void* operator new[](std::size_t size, const std::nothrow_t&) noexcept;
void operator delete[](void* ptr) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;
void* operator new (std::size_t size, void* ptr) noexcept;
void* operator new[](std::size_t size, void* ptr) noexcept;
void operator delete (void* ptr, void*) noexcept;
void operator delete[](void* ptr, void*) noexcept;
То у себя переделал соответственно.

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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <iostream>
#include <map>
#include <stdexcept>
 
template<typename T>
class Storage : public std::map<void*, size_t>
{
public:
   typedef std::map<void*, size_t> base_type;
   typedef base_type::iterator iterator;
 
   ~Storage()
   {
      if (!empty())
      {
         std::cerr << "Not freed: " << size() << " of type: " << T::get_name() << std::endl;
         for (iterator i = begin(); i != end(); ++i)
         {
            std::cerr << i->first << " bytes: " << i->second << std::endl;
         }
      }
   }
   Storage(const Storage&) = delete;
   Storage& operator =(const Storage&) = delete;
   Storage(Storage&&) = delete;
   Storage& operator =(Storage&&) = delete;
   static Storage& instance()
   {
      static Storage storage;
      return storage;
   }
private:
   Storage() = default;
};
 
template<typename T>
class Arena
{
public:
   void* operator new(size_t sz)
   {
      void* result = ::operator new(sz);
      allocated_.insert(std::make_pair(result, sz));
      return result;
   }
   void* operator new(size_t sz, const std::nothrow_t& nt) noexcept
   {
      void* result = ::operator new(sz, nt);
      if (result)
      {
         allocated_.insert(std::make_pair(result, sz));
      }
      return result;
   }
   void* operator new(size_t sz, void* ptr) noexcept
   {
      return ::operator new(sz, ptr);
   }
   void* operator new[](size_t sz)
   {
      void* result = ::operator new[](sz);
      allocated_.insert(std::make_pair(result, sz));
      return result;
   }
   void* operator new[](size_t sz, const std::nothrow_t& nt) noexcept
   {
      void* result = ::operator new[](sz, nt);
      if (result)
      {
         allocated_.insert(std::make_pair(result, sz));
         return result;
      }
   }
   void* operator new[](size_t sz, void* ptr) noexcept
   {
      return ::operator new[](sz, ptr);
   }
   void operator delete(void* ptr) noexcept
   {
      typename Storage<T>::iterator i = allocated_.find(ptr);
      if (i == allocated_.end())
      {
         std::cerr << "Double free on: " << ptr << " of type: " << T::get_name() << ". Terminate program" << std::endl;
         std::abort();
      }
      allocated_.erase(ptr);
      ::operator delete(ptr);
   }
   void operator delete(void* ptr, const std::nothrow_t&) noexcept
   {
      return operator delete(ptr);
   }
   void operator delete(void* ptr, void* place) noexcept
   {
      return ::operator delete(ptr, place);
   }
   void operator delete[](void* ptr) noexcept
   {
      typename Storage<T>::iterator i = allocated_.find(ptr);
      if (i == allocated_.end())
      {
         std::cerr << "Double free on: " << ptr << " of type: " << T::get_name() << ". Terminate program" << std::endl;
         std::abort();
      }
      allocated_.erase(ptr);
      ::operator delete[](ptr);
   }
   void operator delete[](void* ptr, const std::nothrow_t&) noexcept
   {
      return operator delete(ptr);
   }
   void operator delete[](void* ptr, void* place) noexcept
   {
      return ::operator delete(ptr, place);
   }
private:
   static Storage<T>& allocated_;
};
 
template<typename T>
Storage<T>& Arena<T>::allocated_ = Storage<T>::instance();
 
struct Empty : public Arena<Empty>
{
public:
   static const char* get_name() { return "Empty"; }
};
 
struct No : public Arena<No>
{
public:
   static const char* get_name() { return "No"; }
};
 
int main()
{
   Empty* p = new Empty;
   char* ptr = (char*)operator new(sizeof(No));
   No* no = new (ptr) No;
   delete ptr;
   No* no1 = new (std::nothrow) No;
   delete no1;
   No* new_arr = new No[10];
   delete new_arr;
}
Добавлено через 34 минуты
Вот заодно с обработкой UB при неправильном вызове delete-а.

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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#include <iostream>
#include <set>
#include <stdexcept>
 
struct Memory
{
   Memory() { }
   Memory(void* mem, size_t b, size_t els, bool is):
      memory(mem), bytes(b), elements_count(els), is_array(is)
   {
   }
   void* memory;
   size_t bytes;
   size_t elements_count;
   bool is_array;
};
 
bool operator < (const Memory& lhs, const Memory& rhs)
{
   return lhs.memory < rhs.memory;
}
 
std::ostream& operator << (std::ostream& os, const Memory& mem)
{
   os << "Address: " << mem.memory << " elements: " << mem.elements_count << " bytes: " << mem.bytes
      << " is_array: " << std::boolalpha << mem.is_array;
   return os;
}
 
template<typename T>
class Storage : public std::set<Memory>
{
public:
   typedef std::set<Memory> base_type;
   typedef base_type::iterator iterator;
 
   ~Storage()
   {
      if (!empty())
      {
         std::cerr << "Not freed " << size() << " elements of type: " << T::get_name() << std::endl;
         for (iterator i = begin(); i != end(); ++i)
         {
            std::cerr << *i << std::endl;
         }
      }
   }
   Storage(const Storage&) = delete;
   Storage& operator =(const Storage&) = delete;
   Storage(Storage&&) = delete;
   Storage& operator =(Storage&&) = delete;
   static Storage& instance()
   {
      static Storage storage;
      return storage;
   }
private:
   Storage() = default;
};
 
template<typename T>
class Arena
{
public:
   void* operator new(size_t sz)
   {
      void* result = ::operator new(sz);
      allocated_.insert(Memory(result, sz, 1, false));
      return result;
   }
   void* operator new(size_t sz, const std::nothrow_t& nt) noexcept
   {
      void* result = ::operator new(sz, nt);
      if (result)
      {
         allocated_.insert(Memory(result, sz, 1, false));
      }
      return result;
   }
   void* operator new(size_t sz, void* ptr) noexcept
   {
      return ::operator new(sz, ptr);
   }
   void* operator new[](size_t sz)
   {
      void* result = ::operator new[](sz);
      allocated_.insert(Memory(result, sz, sz / sizeof(T), true));
      return result;
   }
   void* operator new[](size_t sz, const std::nothrow_t& nt) noexcept
   {
      void* result = ::operator new[](sz, nt);
      if (result)
      {
         allocated_.insert(Memory(result, sz, sz / sizeof(T), true));
         return result;
      }
   }
   void* operator new[](size_t sz, void* ptr) noexcept
   {
      return ::operator new[](sz, ptr);
   }
   void operator delete(void* ptr) noexcept
   {
      Memory tmp;
      tmp.memory = ptr;
      typename Storage<T>::iterator i = allocated_.find(tmp);
      if (i == allocated_.end())
      {
         std::cerr << "Double free on: " << ptr << " of type: \"" << T::get_name() << "\". Terminate program" << std::endl;
         std::abort();
      }
      else
      {
         if (i->is_array)
         {
            std::cerr << "Free of array: " << i->memory << " of size " << i->elements_count
               << " with " << i->bytes  << " bytes of type \"" << T::get_name() << "\" with non-array delete operator."
               << " Terminate" << std::endl;
            std::abort();
         }
      }
      allocated_.erase(tmp);
      ::operator delete(ptr);
   }
   void operator delete(void* ptr, const std::nothrow_t&) noexcept
   {
      return operator delete(ptr);
   }
   void operator delete(void* ptr, void* place) noexcept
   {
      return ::operator delete(ptr, place);
   }
   void operator delete[](void* ptr) noexcept
   {
      Memory tmp;
      tmp.memory = ptr;
      typename Storage<T>::iterator i = allocated_.find(tmp);
      if (i == allocated_.end())
      {
         std::cerr << "Double free on: " << ptr << " of type: \"" << T::get_name() << "\". Terminate program" << std::endl;
         std::abort();
      }
      else
      {
         if (!i->is_array)
         {
            std::cerr << "Free of element: " << i->memory << " with size " << i->bytes
               << " of type \"" << T::get_name() << "\" with array delete operator."
               << " Terminate" << std::endl;
            std::abort();
         }
      }
      allocated_.erase(tmp);
      ::operator delete[](ptr);
   }
   void operator delete[](void* ptr, const std::nothrow_t&) noexcept
   {
      return operator delete(ptr);
   }
   void operator delete[](void* ptr, void* place) noexcept
   {
      return ::operator delete(ptr, place);
   }
private:
   static Storage<T>& allocated_;
};
 
template<typename T>
Storage<T>& Arena<T>::allocated_ = Storage<T>::instance();
 
struct Empty : public Arena<Empty>
{
public:
   static const char* get_name() { return "Empty"; }
};
 
struct No : public Arena<No>
{
public:
   static const char* get_name() { return "No"; }
};
 
int main()
{
   Empty* p = new Empty;
   char* ptr = (char*)operator new(sizeof(No));
   No* no = new (ptr) No;
   delete ptr;
   No* no1 = new (std::nothrow) No;
   delete no1;
   No* new_arr = new No[10];
   delete[] new_arr;
}
Yandex
Объявления
05.09.2012, 10:44     Как проверить правильно ли ты создал дистрактор
Ответ Создать тему
Опции темы

Текущее время: 02:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru