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

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

Восстановить пароль Регистрация
 
hommius
0 / 0 / 0
Регистрация: 20.10.2012
Сообщений: 12
21.04.2013, 13:45     Уничтожения информации в объекте класса при повторном вызове конструктора #1
]Подскажите, пожалуйста:
есть код типа:

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, чтобы при повторном вызове для него конструктора можно было все почистить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2013, 13:45     Уничтожения информации в объекте класса при повторном вызове конструктора
Посмотрите здесь:

при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! C++
классы. ошибка при вызове конструктора с параметрами C++
ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса C++
C++ Использование конструктора базового класса при динамическом выделении памяти
C++ Пояснение к аргументам при вызове функции, и запрет конструктора по умолчанию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 14:07     Уничтожения информации в объекте класса при повторном вызове конструктора #2
Нужно задать явный оператор присваивания ( в нём должно быть освобождение памяти под b) и деструктор.
hommius
0 / 0 / 0
Регистрация: 20.10.2012
Сообщений: 12
21.04.2013, 14:11  [ТС]     Уничтожения информации в объекте класса при повторном вызове конструктора #3
Т.е. перегрузить операцию присваивания?
А смысл? Будет ведь то же самое...
или...
someClass b = a; //здесь срабатывает конструктор
b = a; //а здесь уже оператор присваивания
будет так?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 14:15     Уничтожения информации в объекте класса при повторном вызове конструктора #4
Цитата Сообщение от hommius Посмотреть сообщение
будет так?
Да.

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

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

Добавлено через 5 минут
Цитата Сообщение от hommius Посмотреть сообщение
то тогда как освобождать память под старым объектом?
Где здесь старый объект?
hommius
0 / 0 / 0
Регистрация: 20.10.2012
Сообщений: 12
21.04.2013, 15:38  [ТС]     Уничтожения информации в объекте класса при повторном вызове конструктора #7
Цитата Сообщение от 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, но выделенная в прошлый раз память не освободилась
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 15:52     Уничтожения информации в объекте класса при повторном вызове конструктора #8
Нужно понять простую вещь. Существует конструктор по умолчанию, деструктор по умолчанию, конструктор копирования по умолчанию и оператор присваивания по умолчанию. Когда они в коде явно не заданы, то будут работать те, которые по умолчанию. Отсюда проблемы, если, в частности, поле класса - указатель, под который выделяется память. Если они заданы явно, то будут работать они, и работать так, как вы напишите. Правильно напишите - будут правильно работать, неправильно напишите - будут неправильно работать. То же самое касается и других методов. Пишите конструктор, в котором не освобождается память. Значит и не освободится. Что мешает освободить?
Для сложения двух объектов класса конструктор необязателен, перегружают оператор + в классе. В нём, в случае необходимости, прописывается освобождение памяти и всё, что нужно. Не забывайте, что это вы код пишите.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
21.04.2013, 16:09     Уничтожения информации в объекте класса при повторном вызове конструктора #9
C++
1
2
someClass z(x,y); // здесь вызывается конструктор
z(x,y); // здесь вызывается не конструктор, а оператор "скобки", которого в классе вообще нету, и компилятор выдаёт соответствующую ошибку
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 16:16     Уничтожения информации в объекте класса при повторном вызове конструктора #10
Цитата Сообщение от Nick Alte Посмотреть сообщение
someClass z(x,y); // здесь вызывается конструктор
Я про него и написал.
Цитата Сообщение от Nick Alte Посмотреть сообщение
z(x,y); // здесь вызывается не конструктор, а оператор "скобки", которого в классе вообще нету, и компилятор выдаёт соответствующую ошибку
И в чём вопрос? Нету - сделайте... Если нужно, конечно.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
21.04.2013, 16:25     Уничтожения информации в объекте класса при повторном вызове конструктора #11
Цитата Сообщение от alsav22 Посмотреть сообщение
И в чём вопрос?
Так я ни о чём и не спрашивал. Просто ТС, по всей видимости, считает, что так он во второй раз вызовет конструктор для уже существующего объекта.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 16:35     Уничтожения информации в объекте класса при повторном вызове конструктора #12
Прошу прощения, спутал вас с ТС.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2013, 16:42     Уничтожения информации в объекте класса при повторном вызове конструктора
Еще ссылки по теме:

Ошибка при вызове метода класса, при чтении из файла C++
Что за ошибка при вызове конструктора? C++
Ошибка при вызове метода класса C++

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

Или воспользуйтесь поиском по форуму:
hommius
0 / 0 / 0
Регистрация: 20.10.2012
Сообщений: 12
21.04.2013, 16:42  [ТС]     Уничтожения информации в объекте класса при повторном вызове конструктора #13
Цитата Сообщение от Nick Alte Посмотреть сообщение
Просто ТС, по всей видимости, считает, что так он во второй раз вызовет конструктор для уже существующего объекта.
Да, в этом и была моя ошибка. Всем большое спасибо за помощь.
Yandex
Объявления
21.04.2013, 16:42     Уничтожения информации в объекте класса при повторном вызове конструктора
Ответ Создать тему
Опции темы

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