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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Flassie
182 / 167 / 29
Регистрация: 03.08.2012
Сообщений: 591
Завершенные тесты: 2
#1

Указатели и очистка памяти - C++

13.01.2014, 21:44. Просмотров 604. Ответов 14
Метки нет (Все метки)

Возник интересный вопрос...
C++
1
2
3
4
5
6
7
8
class Test { int a; }; class Test1 : public Test { int b, c; };
int main()
{
   Test1 *t = new Test1;
   Test *t1 = t;
 
   delete t;
}
(код на работоспособность не проверял, но думаю и так ясно, что я хотел показать)
Память в данном случае очищается вся (Test1), или только занимаемая классом Test?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2014, 21:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели и очистка памяти (C++):

указатели и очистка памяти - C++
В отличии от java в с++ память по умолчанию нужно очищать самостоятельно. Понятно, что если память зарезервированная неким указателем...

Очистка памяти - C++
При выполнении программы, память приложения растёт, а она должна быть неизменной. int main() { setlocale(LC_ALL, "Russian"); ...

Очистка памяти - C++
Цель: Написать программу, которая читает текст из файла и записывает в новый файл те слова, которые содержат буквы, введенные с...

Очистка памяти - C++
Вот сделал лабу и все работает отлично, но осталось последнее new выделяет память мне нужно добавить функцию которая будет вызыватся в...

очистка памяти - C++
в данном случае деструктор очистит всё, или нет? #include "base.h" #include <cstdlib> #include <ctime> base::base(int x,int y) { ...

Очистка памяти - C++
Подскажите пожалуйста что не так делаю, создаю массив лейблов: TLabel **Labels; Labels = new TLabel*; for(int i = 0; i < rabot +...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
13.01.2014, 21:47 #2
Форматировать код не учили?
Цитата Сообщение от Flassie Посмотреть сообщение
Память в данном случае очищается вся (Test1), или только занимаемая классом Test?
чего?
0
Flassie
182 / 167 / 29
Регистрация: 03.08.2012
Сообщений: 591
Завершенные тесты: 2
13.01.2014, 22:32  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Форматировать код не учили?
Ох, очень прошу извинений. Специально для вас:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Test
{
public:
   int a;
};
 
class Test1 : public Test
{
public:
   int b, c;
};
 
int main()
{
   Test1 *t = new Test1;
   Test *t1 = t;
 
   delete t1; 
}
Вопрос:
C++
1
delete t1; // Сколько памяти будет очищено, 4 байта или 12 байт?
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
13.01.2014, 22:34 #4
Цитата Сообщение от Flassie Посмотреть сообщение
Сколько памяти будет очищено, 4 байта или 12 байт?
А сколько байт занимают объекты классов?
0
Flassie
182 / 167 / 29
Регистрация: 03.08.2012
Сообщений: 591
Завершенные тесты: 2
13.01.2014, 22:36  [ТС] #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
А сколько байт занимают объекты классов?
Ну, если я не ошибаюсь:
Test - 4 (содержит в себе int)
Test1 - 12 (содержит в себе 3 int'a)
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
13.01.2014, 22:38 #6
Цитата Сообщение от Flassie Посмотреть сообщение
Ну, если я не ошибаюсь:
Test - 4 (содержит в себе int)
Test1 - 12 (содержит в себе 3 int'a)
Ага, а я что спрашивал?
0
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
13.01.2014, 22:38 #7
Память то очистится как нужно, но деструктор Test1 вызван не будет
1
Flassie
182 / 167 / 29
Регистрация: 03.08.2012
Сообщений: 591
Завершенные тесты: 2
13.01.2014, 22:40  [ТС] #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ага, а я что спрашивал?
Вы спрашивали, сколько занимают объекты классов, я вам и написал. Или я вас не так понял?

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Память то очистится как нужно, но деструктор Test1 вызван не будет
Благодарю. Это мне и нужно было знать
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.01.2014, 22:43 #9
кстати память возможно удалится вся.
а вот деструкторы в производном классе не выполнятся. у вас инты - и это вроде не так страшно.
их деструкторы ничего не делают. а вот если бы какие-нибудь строки были или другие
ресурс-холдеры - вот тут была бы утечка.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
13.01.2014, 22:44 #10
Цитата Сообщение от Flassie Посмотреть сообщение
Вы спрашивали, сколько занимают объекты классов, я вам и написал
я спрашивал сколько байт занимают объекты (чтоб ответить на вопрос из 3го поста), а вы написали сколько int'ов они содержат, а это ничего не дающая информация.

Не по теме:

Не, суть вопроса я еще в первом посте понял, просто хотелось услышать корректно поставленный вопрос

0
Flassie
182 / 167 / 29
Регистрация: 03.08.2012
Сообщений: 591
Завершенные тесты: 2
13.01.2014, 22:50  [ТС] #11
Цитата Сообщение от Kastaneda Посмотреть сообщение
я спрашивал сколько байт занимают объекты
Цитата Сообщение от Flassie Посмотреть сообщение
Test - 4 (содержит в себе int)
Test1 - 12 (содержит в себе 3 int'a)
Не зря же эти 2 подчеркнутые циферки там стоят
0
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
13.01.2014, 22:52 #12
Цитата Сообщение от Flassie Посмотреть сообщение
Не зря же эти 2 подчеркнутые циферки там стоят
а если int не 4 байта будет?
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
13.01.2014, 22:55 #13
Цитата Сообщение от Flassie Посмотреть сообщение
Не зря же эти 2 подчеркнутые циферки там стоят
точно, извиняюсь, сразу не увидел, переработал сегодня...

Но все равно выше уже сказали, что это не правильная логика. + выравнивание еще существует.
0
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
13.01.2014, 23:00 #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Память то очистится как нужно, но деструктор Test1 вызван не будет
может был не прав:
In the first alternative (delete object), if the static type of the object to be deleted is different from its dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined. In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.
0
Flassie
182 / 167 / 29
Регистрация: 03.08.2012
Сообщений: 591
Завершенные тесты: 2
13.01.2014, 23:15  [ТС] #15
Цитата Сообщение от Kastaneda Посмотреть сообщение
Но все равно выше уже сказали, что это не правильная логика
Ну, вы размер спросили - я его сказал. Вы же не спрашивали, какой он может быть

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
выравнивание еще существует
Знаю. И прошу еще раз прощения



Добавлено через 14 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
In the first alternative (delete object), if the static type of the object to be deleted is different from its dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined.
То есть я правильно понял - в моем случае непонятно, как поведет себя программа?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2014, 23:15
Привет! Вот еще темы с ответами:

Очистка памяти - C++
Как правильно очистить память в массиве классов Вот код конструктора, выделяющего память, и деструктора. Выдает ошибку в самом конце...

Ссылки и очистка памяти - C++
Здравствуйте! Если я создаю ссылку и присваиваю ей значение (константу или нет) должен я как и с указателями заботится об памяти? ...

Очистка памяти delete[]; - C++
Есть функция ввида: void loltest(int md3) { char* randChars; int cCount; if(md3 <= 0) cCount = 13; ...

Vector, очистка памяти - C++
У меня есть вектор, который состоит из объектов типа класс. После выполнения данного блока мои объекты удаляются(вызываются ихние...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.01.2014, 23:15
Ответ Создать тему
Опции темы

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