Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
мну довольно <(-__-)l
 Аватар для gGrn-7DA
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462

деструктор

03.04.2011, 21:31. Показов 3670. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для освобождения памяти динамически выделенных массивам надо использовать delete[].
требуется ли освобождать память выделенную под простой указатель?
C++
1
2
3
4
5
6
7
class A{}
class B{
A *a;
B(){
a=new A();
}
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2011, 21:31
Ответы с готовыми решениями:

Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
Почему я делаю виртуальным деструктор A, а в таблице виртуальных функций лежит деструктор B?

Деструктор
Добрый вечер!мне нужна одна программа для примера(рабочая),но это тему мы коснулись слегка..хотел попросить у кого есть...

Деструктор
Вроде все просто но чето никак не работает Задача: Написать программу в которой Конструктор класса MyCl выводит сообщение на...

10
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
03.04.2011, 21:32
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
требуется ли освобождать память выделенную под простой указатель?
Да, только писать надо просто
C++
1
delete a;
То есть без скобочек []. Для массивов объектов со скобочками.
1
мну довольно <(-__-)l
 Аватар для gGrn-7DA
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
03.04.2011, 21:39  [ТС]
Спасибо!
Еще вопрос.
В случае использования списков? требуется рекурсивно вызывать деструктор, или он автоматов вызывается при delete a?
C++
1
2
3
4
5
6
7
class A{
  A*a;
  ~A(){
    a->~A();//надо ли это?
    delete a;
  }
}

Добавлено через 4 минуты
Еще вопрос.
При использовании многомерных массивов
C++
1
A ****a;
сначала надо освобождать память выделенная для A*, потом A** и так далее. То есть при освобождении памяти, выделенной массиву, рекурсивного освобождения памяти не происходит. А деструктор для объектов класса A, находящихся на самых концах массива, автоматом вызывается при delete[] a[i1][i2][i3] или нет?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
03.04.2011, 22:00
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
В случае использования списков?
В этом вопросе я не совсем понял, о чем идет речь, но так как написано у Вас, делать точно не надо
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
То есть при освобождении памяти, выделенной массиву, рекурсивного освобождения памяти не происходит.
Рекурсивного освобождения памяти не происходит, все что создано с помощью new должно быть освобождено с помощью delete. Пример с многомерными массивами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using std::cout;
 
int main()
{
    int ***ptr = NULL;
 
    ptr = new int **[3];
    cout << ptr << " was created\n";
 
    for (int i = 0; i < 3; ++i) {
        ptr[i] = new int *[3];
        cout << ptr[i] << " was created\n";
 
        for (int j = 0; j < 3; ++j) {
            ptr[i][j] = new int;
            cout << ptr[i][j] << " was created\n";
        }
    }
 
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 3; ++j) {
            cout << ptr[i][j] << " was deleted\n";
            delete ptr[i][j];
        }
 
        cout << ptr[i] << " was deleted\n";
        delete[] ptr[i];
    }
 
    cout << ptr << " was deleted\n";
    delete[] ptr;
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
006C7680 was created
006C8160 was created
004E1990 was created
004E19C0 was created
004E1A20 was created
006C8198 was created
004E1A50 was created
004E1A80 was created
004E1AB0 was created
006C8328 was created
004E1AE0 was created
004E1B10 was created
004E1B40 was created
 
004E1990 was deleted
004E19C0 was deleted
004E1A20 was deleted
006C8160 was deleted
004E1A50 was deleted
004E1A80 was deleted
004E1AB0 was deleted
006C8198 was deleted
004E1AE0 was deleted
004E1B10 was deleted
004E1B40 was deleted
006C8328 was deleted
006C7680 was deleted
По результатам видно, что для каждого указателя (адреса), для которого выделена память, существует вызов delete.
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
А деструктор для объектов класса A, находящихся на самых концах массива, автоматом вызывается при delete[] a[i1][i2][i3] или нет?
Опять же не совсем понимаю, о чем идет речь, но деструктор вызывается при delete. Смотрим пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using std::cout;
 
class Object
{
public:
    Object() {
        ptr = new int;
        cout << ptr << " was created\n";
    }
 
    ~Object() {
        cout << ptr << " was deleted\n";
        delete ptr;
    }
 
private:
    int *ptr;
};
 
int main()
{
    Object *objects = new Object[2];
    cout << objects << " was created\n";
 
    cout << objects << " was deleted\n";
    delete[] objects;
}
При выделении динамической памяти для objects срабатывает конструктор по умолчанию. При вызове delete[] objects срабатывает деструктор для каждого objects[i]. Результат опять же подтверждает сказанное.
Code
1
2
3
4
5
6
7
00591990 was created
005919C0 was created
00577684 was created
 
00577684 was deleted
005919C0 was deleted
00591990 was deleted
0
32 / 34 / 3
Регистрация: 27.12.2009
Сообщений: 106
03.04.2011, 22:00
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
Еще вопрос.
При использовании многомерных массивов
C++
1
A ****a;
сначала надо освобождать память выделенная для A*, потом A** и так далее. То есть при освобождении памяти, выделенной массиву, рекурсивного освобождения памяти не происходит. А деструктор для объектов класса A, находящихся на самых концах массива, автоматом вызывается при delete[] a[i1][i2][i3] или нет?
приведу пример с матрицей

C++
1
2
3
4
5
6
7
8
9
int** a = new int*[10];
for(int i = 0; i < 10; i++)
a[i] = new int[15];
...
//работа с матрицей
...
for(int i = 0; i < 10; i++)
delete [] a[i];
delete a;
сначала создается динамический массив указателей, каждый элемент которого указывает на дин. массив. освобождение памяти происходит в обратном порядке
0
мну довольно <(-__-)l
 Аватар для gGrn-7DA
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
03.04.2011, 22:08  [ТС]
fasked, В последнем листинге именно то что спрашивал) это был третий вопрос, а теперь о втором.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class A{
public:
A*a;
~A(){delete a;}
}
void Main(){
   A *a=new A();
   a->a=new A();
   a->a->a=new A();
   a->a->a->a=new A();
   a->a->a->a->a=new A();
   delete a;
}
произойдет ли рекурсивное удаление всех объектов?


ailia, не узнал ничего нового. Я это и так знал. Вопрос был слегка о другом)
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
03.04.2011, 22:14
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
произойдет ли рекурсивное удаление всех объектов?
Да, рекурсивный вызов начнется, но в итоге программа упадет при обращении к участку памяти, для которого не был произведен вызов new. Тут нужен какой-то стоп-сигнал, дабы деструктор остановился
1
мну довольно <(-__-)l
 Аватар для gGrn-7DA
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
03.04.2011, 22:19  [ТС]
C++
1
if(a!=NULL) delete a;
Дкмаю пойдет?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
03.04.2011, 22:21
Тогда надо в конструкторе проинициализировать указатель, потому что изначально в нем будет мусор. То есть код должен выглядеть примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A {
public:
    A *a;
 
    A() {
        a = NULL;
    }
 
    ~A() {
        if (a != NULL)
            delete a;
    }
};
 
int main() {
    A *a = new A();
    a->a = new A();
    a->a->a = new A();
 
    delete a;
}
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
03.04.2011, 23:07
Цитата Сообщение от fasked Посмотреть сообщение
C++
1
if (a != NULL) delete a;
Эта проверка излишняя, так как нулевой указатель удалять можно.
1
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.04.2011, 07:57
Цитата Сообщение от Mr.X Посмотреть сообщение
Эта проверка излишняя, так как нулевой указатель удалять можно.
*т.к. эта проверка происходит внутри delete

Цитата Сообщение от gGrn-7DA Посмотреть сообщение
a->~A();//надо ли это?
delete a;
Деструктор будет вызван для разрушения объекта перед освобождением памяти. Вручную вызывать не нужно, только delete.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.04.2011, 07:57
Помогаю со студенческими работами здесь

Деструктор
Здравствуйте! Имеется класс Matrix, который представляет собой массив других объектов - объектов класса Vector class Vector ...

Деструктор
Ребята, объясните, пожалуйста, где, как и когда в программе вызывается деструктор? Вот мой пример: #include &lt;iostream&gt; using...

Деструктор
Здравствуйте, все работает отлично, но когда я добавила деструктор, то сразу выдало ошибку, помогите разобраться)). Спасибо! //Создать...

Деструктор
Не понимаю почему в проге не работает строка cout &lt;&lt; &quot;Удаляем элемент списка!&quot;; вроде деструктор вызываеться автоматически, как пишет...

Деструктор
Я написал деструктор, но препод сказал переделать так как надо было смотреть на то, как я выделял память. Помогите исправить. int **m6; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru