![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 03.11.2012
Сообщений: 89
|
![]()
Всем привет!
Вобщем решил вчера потренироваться в недавно-пройденном материале по выделению памяти new для указателей на данные в конструкторах класса и delete в деструкторе. И что-то в совсем застрял. А именно проблема с управлением памятью с помощью кострукторов копирования и присваивания. Накалякал следующее: work.h Код:
Код:
Код:
На оформление кода не смотрите, это состряпано чисто для освежения моей памяти ![]() |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,372
|
![]() Код:
Кстати, зачем выделять память под string, не проще сделать его обычной переменной класса? |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
![]()
Принципиальная ошибка - статический счетчик.
Объекты могут содержать разные строки, а счетчик почему-то один. И кроме того, где эта проверка в деструкторе, мол счетчик не нулевой - строку не удаляем. |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]()
operator= - не конструктор. Он не изменяет количества существующих объектов.
Код:
|
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]() Цитата:
И, по задумке автора, должен считать общее количество существующих объектов типа Work. Это же одно число, верно? |
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
![]()
На кой черт их считать, если это ни где не используется
![]() Задумка-то наверное была как подсчет ссылок, но что-то не дописано. |
![]() |
![]() |
![]() |
#7 | |||||
Пользователь
Регистрация: 03.11.2012
Сообщений: 89
|
![]() Цитата:
Цитата:
Цитата:
Цитата:
![]() Цитата:
Последний раз редактировалось Stilet; 21.12.2012 в 16:33. |
|||||
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
![]()
Так что тут понимать. Выделил через new - один раз удалил через delete.
Если попытаться удалить второй раз уже освобожденный блок - вылетает с ошибкой. Поэтому при дублировании указателя на строку счетчик должен увеличиться на единицу, а в деструкторе, наоборот, декремент. И если он нулевой, только тогда вызов delete. |
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 03.11.2012
Сообщений: 89
|
![]() |
![]() |
![]() |
![]() |
#10 | ||
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]() Цитата:
Код:
Цитата:
Последний раз редактировалось Abstraction; 21.12.2012 в 15:13. |
||
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Выделение памяти | Dady 1992 | Общие вопросы C/C++ | 2 | 26.06.2012 18:45 |
Распределение памяти. Динамическое выделение памяти с++ | Tolian92 | Помощь студентам | 8 | 14.05.2012 21:44 |
Конструктор копирования и оператор присваивания | DenisS0 | Общие вопросы C/C++ | 4 | 05.12.2011 10:41 |
До выделение памяти | MAKTE | Общие вопросы C/C++ | 4 | 20.05.2008 21:34 |