Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
1

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

04.09.2012, 21:52. Показов 1272. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
сабжж ???
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2012, 21:52
Ответы с готовыми решениями:

Как проверить что я создал правильную матрицу?
Sub SingleMatrix() Dim i As Integer, j As Integer, A(1 To 3, 1 To 3) As Integer For i = 1...

Создал шаблон сайта в photoshope. Как теперь его правильно сверстать?
Имееться множество картинок, их придется резать на части? Так? И потом по отдельности верстать?

Правильно ли я создал таблицу?
В Erwin у меня есть такая связь: Правильно ли я создал таблицу Заказ_Товар? Create Table...

Правильно ли я создал таблицу?
Спустя 4 года практики создания сайтов на основе Вордпресса решил возобновить создание сайтов со...

17
2274 / 1765 / 741
Регистрация: 27.07.2012
Сообщений: 5,247
04.09.2012, 21:54 2
Компилируется?
1
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
04.09.2012, 21:59  [ТС] 3
Цитата Сообщение от John Prick Посмотреть сообщение
Компилируется?
а как же
нет тут вопрос в другом
допустим все компилируется и даже удаляется все или копируется все хорошо но возможно в данном проекте будут использоваться спец кейсы которые будут валить правильность выполнения операций

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

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


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

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

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

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

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

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



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


расскажи мне как ты их будешь удалять если они привязанну к обычному указателю без мусоросборника ?
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
04.09.2012, 23:32 11
Цитата Сообщение от Leeto Посмотреть сообщение
ак ты их будешь удалять если они привязанну к обычному указателю без мусоросборника ?
Операцией delete, как все нормальные люди.
2
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
04.09.2012, 23:42 12
Цитата Сообщение от Leeto Посмотреть сообщение
ты забыл добавить что конкретно тебе моя цели размыта и не понятна
Это предложение не поддается моему здравому смыслу.

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

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

расскажи мне как ты их будешь удалять если они привязанну к обычному указателю без мусоросборника ?
Ящитаю, это половые трудности другого класса — удалять свои динамически созданные объекты. Вызвали деструктор — объект должен умереть. Вместе со всем, что он для себя насоздавал.
2
7 / 7 / 3
Регистрация: 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 ;
}
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
04.09.2012, 23:59 15
~OhMyGodSoLong~, я абсолютно с вами согласен.
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
05.09.2012, 00:00 16
Цитата Сообщение от Leeto Посмотреть сообщение
Другими словами если функция / библиотечный элемент, который перед тем как прога завершенно выдает количество мусора которое висит в хипе ???
Прогу уже называли: valgrind.

С типами данных вряд ли информацию можно выдать (нет рефлексии), но просто суммарно количество просранной памяти теоретически реально: переопределяете глобальные operator new и operator delete, пусть ведут лог того, сколько выделено и сколько удалено.
1
7 / 7 / 3
Регистрация: 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 классов такую перегруженную штуку писать ???
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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;
}
3
05.09.2012, 10:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2012, 10:44
Помогаю со студенческими работами здесь

Подскажите, правильно ли я создал связи?

Правильно ли создал запрос с внешними ключами MYSQL
Приветствую, правильно ли я сделал .Если нет , объясните что не так address_id из таблицы Users-...

[Подскажите ламеру] Правильно ли я создал структуру инфоблоков для интернет-магазина?
Три дня ищу и не найду - как лучше организовать торговый каталог. Имею десяток категорий товара...

Как правильно проверить на вирусы?
Приветствую, извиняюсь за глупый наверно вопрос.. приобрёл б.у. ноут бук, лицензионный виндоус 7...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru