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

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

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

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

13.01.2014, 21:44. Просмотров 549. Ответов 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?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2014, 21:44     Указатели и очистка памяти
Посмотрите здесь:

C++ Очистка памяти
C++ Очистка памяти массива (С++)
C++ указатели и очистка памяти
C++ Очистка памяти
Очистка памяти - ошибка C++
C++ Очистка памяти
Vector, очистка памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,940
Записей в блоге: 2
Завершенные тесты: 1
13.01.2014, 21:47     Указатели и очистка памяти #2
Форматировать код не учили?
Цитата Сообщение от Flassie Посмотреть сообщение
Память в данном случае очищается вся (Test1), или только занимаемая классом Test?
чего?
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 байт?
Kastaneda
Форумчанин
Эксперт С++
4468 / 2830 / 224
Регистрация: 12.12.2009
Сообщений: 7,199
Записей в блоге: 1
Завершенные тесты: 1
13.01.2014, 22:34     Указатели и очистка памяти #4
Цитата Сообщение от Flassie Посмотреть сообщение
Сколько памяти будет очищено, 4 байта или 12 байт?
А сколько байт занимают объекты классов?
Flassie
182 / 167 / 29
Регистрация: 03.08.2012
Сообщений: 591
Завершенные тесты: 2
13.01.2014, 22:36  [ТС]     Указатели и очистка памяти #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
А сколько байт занимают объекты классов?
Ну, если я не ошибаюсь:
Test - 4 (содержит в себе int)
Test1 - 12 (содержит в себе 3 int'a)
Kastaneda
Форумчанин
Эксперт С++
4468 / 2830 / 224
Регистрация: 12.12.2009
Сообщений: 7,199
Записей в блоге: 1
Завершенные тесты: 1
13.01.2014, 22:38     Указатели и очистка памяти #6
Цитата Сообщение от Flassie Посмотреть сообщение
Ну, если я не ошибаюсь:
Test - 4 (содержит в себе int)
Test1 - 12 (содержит в себе 3 int'a)
Ага, а я что спрашивал?
Croessmah
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,940
Записей в блоге: 2
Завершенные тесты: 1
13.01.2014, 22:38     Указатели и очистка памяти #7
Память то очистится как нужно, но деструктор Test1 вызван не будет
Flassie
182 / 167 / 29
Регистрация: 03.08.2012
Сообщений: 591
Завершенные тесты: 2
13.01.2014, 22:40  [ТС]     Указатели и очистка памяти #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ага, а я что спрашивал?
Вы спрашивали, сколько занимают объекты классов, я вам и написал. Или я вас не так понял?

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

Не по теме:

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

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 подчеркнутые циферки там стоят
Croessmah
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,940
Записей в блоге: 2
Завершенные тесты: 1
13.01.2014, 22:52     Указатели и очистка памяти #12
Цитата Сообщение от Flassie Посмотреть сообщение
Не зря же эти 2 подчеркнутые циферки там стоят
а если int не 4 байта будет?
Kastaneda
Форумчанин
Эксперт С++
4468 / 2830 / 224
Регистрация: 12.12.2009
Сообщений: 7,199
Записей в блоге: 1
Завершенные тесты: 1
13.01.2014, 22:55     Указатели и очистка памяти #13
Цитата Сообщение от Flassie Посмотреть сообщение
Не зря же эти 2 подчеркнутые циферки там стоят
точно, извиняюсь, сразу не увидел, переработал сегодня...

Но все равно выше уже сказали, что это не правильная логика. + выравнивание еще существует.
Croessmah
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,940
Записей в блоге: 2
Завершенные тесты: 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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2014, 23:15     Указатели и очистка памяти
Еще ссылки по теме:

Правильная очистка памяти C++
C++ Очистка памяти
очистка памяти C++
C++ Ссылки и очистка памяти
C++ Очистка памяти

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

Или воспользуйтесь поиском по форуму:
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.
То есть я правильно понял - в моем случае непонятно, как поведет себя программа?
Yandex
Объявления
13.01.2014, 23:15     Указатели и очистка памяти
Ответ Создать тему
Опции темы

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