С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 20.10.2012
Сообщений: 12

Уничтожения информации в объекте класса при повторном вызове конструктора

21.04.2013, 13:45. Показов 1136. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
]Подскажите, пожалуйста:
есть код типа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class someClass {
public:
int* someArray;
someClass() { 
someArray = new int[100500];
for(int i = 0; i<100500; ++i) someArray[i] = i;
}
someClass(const someClass& someObject) {
someArray = new int[100500]; 
for(int i = 0; i<100500; ++i) someArray[i] = someObject->someArray[i];
}
 };
 
 
int main {
someClass a; //в объекте a был создан массив на 100500 целых чисел, заполнен какими-то числами
someClass b = a; //в объекте b был создан массив на 100500 целых чисел, заполнен значениями из a
b = a; //еще один массив на 100500 чисел был создан. созданное в предыдущей строке висит где-то в памяти
return 0;
}
Вопрос: как можно узнать был ли ранее создан объект b, чтобы при повторном вызове для него конструктора можно было все почистить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.04.2013, 13:45
Ответы с готовыми решениями:

Что за ошибка при вызове конструктора?
Компилятор ругается на строчку внутри цикла while((c = getchar()) != '\n') { q = new Sym(c); } Sym - класс, а c -...

Ошибка при вызове конструктора с параметрами
подскажите, почему при вызове конструктора с параметрами выдает ошибку сегментации #include&lt;math.h&gt; #include&lt;stdio.h&gt; ...

Крашится приложение при вызове конструктора
Здравствуйте. Написал класс, а при вызове конструктора (класса Ground) приложение крашится. Где я облажался? class Plate { ...

12
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 14:07
Нужно задать явный оператор присваивания ( в нём должно быть освобождение памяти под b) и деструктор.
1
0 / 0 / 0
Регистрация: 20.10.2012
Сообщений: 12
21.04.2013, 14:11  [ТС]
Т.е. перегрузить операцию присваивания?
А смысл? Будет ведь то же самое...
или...
someClass b = a; //здесь срабатывает конструктор
b = a; //а здесь уже оператор присваивания
будет так?
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 14:15
Цитата Сообщение от hommius Посмотреть сообщение
будет так?
Да.

Добавлено через 1 минуту
Если в классе есть указатель и под него выделяется память, то всегда задаются явные конструктор копирования и присваивания. И про деструктор не забудьте.

Добавлено через 1 минуту
Цитата Сообщение от hommius Посмотреть сообщение
А смысл?
Смысл в том, что в явном операторе присваивания будет освобождение памяти, под старым объектом.
1
0 / 0 / 0
Регистрация: 20.10.2012
Сообщений: 12
21.04.2013, 15:04  [ТС]
Хм, а если конструктор описывается так:
C++
1
someClass(const someClass& firstObject, const someClass& secondObject);
то тогда как освобождать память под старым объектом?
ситуация:
someClass x;
someClass y;
someClass z(x,y); //выделенная здесь память потеряется
someClass z(x,y);
Присвоением здесь, увы, не обойтись
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 15:25
Хм, а если конструктор описывается так:
C++
1
someClass(const someClass& firstObject, const someClass& secondObject);
Что в нём делается?
Цитата Сообщение от hommius Посмотреть сообщение
someClass z(x,y); //выделенная здесь память потеряется
Из чего это следует?
Цитата Сообщение от hommius Посмотреть сообщение
Присвоением здесь, увы, не обойтись
Конструктор копий уже задан.

Добавлено через 5 минут
Цитата Сообщение от hommius Посмотреть сообщение
то тогда как освобождать память под старым объектом?
Где здесь старый объект?
0
0 / 0 / 0
Регистрация: 20.10.2012
Сообщений: 12
21.04.2013, 15:38  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Что в нём делается?
C++
1
2
3
4
someClass(const someClass& firstObject, const someClass& secondObject) {
someArray = int[100500];
for(int i = 0; i<100500; ++i) someArray[i] = firstObject.someArray[i] + secondObject.someArray[i];
}
Из чего это следует?
C++
1
2
someClass z(x,y); //память под массив была выделена объекту z
z(x,y); //память под массив еще раз была выделена объекту z, но выделенная в прошлый раз память не освободилась
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 15:52
Нужно понять простую вещь. Существует конструктор по умолчанию, деструктор по умолчанию, конструктор копирования по умолчанию и оператор присваивания по умолчанию. Когда они в коде явно не заданы, то будут работать те, которые по умолчанию. Отсюда проблемы, если, в частности, поле класса - указатель, под который выделяется память. Если они заданы явно, то будут работать они, и работать так, как вы напишите. Правильно напишите - будут правильно работать, неправильно напишите - будут неправильно работать. То же самое касается и других методов. Пишите конструктор, в котором не освобождается память. Значит и не освободится. Что мешает освободить?
Для сложения двух объектов класса конструктор необязателен, перегружают оператор + в классе. В нём, в случае необходимости, прописывается освобождение памяти и всё, что нужно. Не забывайте, что это вы код пишите.
1
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
21.04.2013, 16:09
C++
1
2
someClass z(x,y); // здесь вызывается конструктор
z(x,y); // здесь вызывается не конструктор, а оператор "скобки", которого в классе вообще нету, и компилятор выдаёт соответствующую ошибку
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 16:16
Цитата Сообщение от Nick Alte Посмотреть сообщение
someClass z(x,y); // здесь вызывается конструктор
Я про него и написал.
Цитата Сообщение от Nick Alte Посмотреть сообщение
z(x,y); // здесь вызывается не конструктор, а оператор "скобки", которого в классе вообще нету, и компилятор выдаёт соответствующую ошибку
И в чём вопрос? Нету - сделайте... Если нужно, конечно.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
21.04.2013, 16:25
Цитата Сообщение от alsav22 Посмотреть сообщение
И в чём вопрос?
Так я ни о чём и не спрашивал. Просто ТС, по всей видимости, считает, что так он во второй раз вызовет конструктор для уже существующего объекта.
1
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 16:35
Прошу прощения, спутал вас с ТС.
1
0 / 0 / 0
Регистрация: 20.10.2012
Сообщений: 12
21.04.2013, 16:42  [ТС]
Цитата Сообщение от Nick Alte Посмотреть сообщение
Просто ТС, по всей видимости, считает, что так он во второй раз вызовет конструктор для уже существующего объекта.
Да, в этом и была моя ошибка. Всем большое спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.04.2013, 16:42
Помогаю со студенческими работами здесь

Пояснение к аргументам при вызове функции, и запрет конструктора по умолчанию
Вобщем касательно конструктора такой код: class box { public: box(int t):z(t){y=6;} void Set(int u, float...

Ошибка при вызове метода класса в методе другого класса
Господа программисты, возникла такая проблема. При вызове метода класса в методе другого класса выходит такая ошибка &quot; нестандартный...

Почему если при вызове метода Foo от типа B, в объекте класса FooImp вызывается метод от А?
Поясните пожалуйста, почему если при вызове метода Foo от типа B, в объекте класса FooImp вызывается метод от А ? public class...

Ошибка при вызове конструктора по причине:-2147221005(0x800401F3): Недопустимая строка с указанием класса
Пытаюсь запустить конфигурацию, выходит такая ошибка: {ОбщийМодуль.ДоработкиКэшСеанса.Модуль(19)}: Ошибка при вызове конструктора...

Почему при вызове конструктора из конструктора нельзя передавать this как аргумент?
Есть такой код: public class Order { { } Order(){ this(this.hashCode());//ошибка тут } ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru