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

деструктор

03.04.2011, 21:31. Показов 3710. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru