Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
hommius
0 / 0 / 0
Регистрация: 20.10.2012
Сообщений: 12
#1

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

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

]Подскажите, пожалуйста:
есть код типа:
http://www.cyberforum.ru/cpp-beginners/thread1422231.html

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

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

Ошибка при вызове конструктора с параметрами
подскажите, почему при вызове конструктора с параметрами выдает ошибку...

Пояснение к аргументам при вызове функции, и запрет конструктора по умолчанию
Вобщем касательно конструктора такой код: class box { public: box(int...

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

Ошибка при вызове метода класса, при чтении из файла
добрый день, пытаюсь считать данные из и запихнуть их в список в файле у меня...

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

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

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

Ошибка при вызове метода класса
ошибка возникает когда я вызываю метод ti #include &lt;iostream&gt; using...

_BLOCK_TYPE_IS_VALID при вызове деструктора класса
при вызове деструктора моего класса вылетает ошибка...

Ошибка при вызове метода класса
После вызова метода getSize() на вызове метода getData() программа крашится....

Вызов одного класса при вызове дргуого
Есть два класса Institut и Director. в цикле вызывается институт, и при...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru