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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
#1

деструктор - C++

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

Для освобождения памяти динамически выделенных массивам надо использовать delete[].
требуется ли освобождать память выделенную под простой указатель?
C++
1
2
3
4
5
6
7
class A{}
class B{
A *a;
B(){
a=new A();
}
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2011, 21:31     деструктор
Посмотрите здесь:

Деструктор - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #define _CRTDBG_MAP_ALLOC #include &lt;crtdbg.h&gt; using namespace std; class list{ ...

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

Деструктор - C++
В чем проблема?)

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

Деструктор - C++
здравствуйте. подскажите пожалуйста ... почему деструктор некорректно работает ? не хочет уничтожает объекты динамического массива (...

Деструктор! - C++
Как вызвать деструктор? #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;string&gt; using...

деструктор - C++
опять же проблема с лабой. помоги дописать деструктор. #include &quot;stdafx.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; using...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
03.04.2011, 21:32     деструктор #2
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
требуется ли освобождать память выделенную под простой указатель?
Да, только писать надо просто
C++
1
delete a;
То есть без скобочек []. Для массивов объектов со скобочками.
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
03.04.2011, 21:39  [ТС]     деструктор #3
Спасибо!
Еще вопрос.
В случае использования списков? требуется рекурсивно вызывать деструктор, или он автоматов вызывается при 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] или нет?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
03.04.2011, 22:00     деструктор #4
Цитата Сообщение от 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;
}
Код
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]. Результат опять же подтверждает сказанное.
Код
00591990 was created
005919C0 was created
00577684 was created

00577684 was deleted
005919C0 was deleted
00591990 was deleted
ailia
27 / 26 / 1
Регистрация: 27.12.2009
Сообщений: 106
03.04.2011, 22:00     деструктор #5
Цитата Сообщение от 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;
сначала создается динамический массив указателей, каждый элемент которого указывает на дин. массив. освобождение памяти происходит в обратном порядке
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
03.04.2011, 22:08  [ТС]     деструктор #6
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, не узнал ничего нового. Я это и так знал. Вопрос был слегка о другом)
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
03.04.2011, 22:14     деструктор #7
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
произойдет ли рекурсивное удаление всех объектов?
Да, рекурсивный вызов начнется, но в итоге программа упадет при обращении к участку памяти, для которого не был произведен вызов new. Тут нужен какой-то стоп-сигнал, дабы деструктор остановился
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
03.04.2011, 22:19  [ТС]     деструктор #8
C++
1
if(a!=NULL) delete a;
Дкмаю пойдет?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
03.04.2011, 22:21     деструктор #9
Тогда надо в конструкторе проинициализировать указатель, потому что изначально в нем будет мусор. То есть код должен выглядеть примерно так:
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;
}
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
03.04.2011, 23:07     деструктор #10
Цитата Сообщение от fasked Посмотреть сообщение
C++
1
if (a != NULL) delete a;
Эта проверка излишняя, так как нулевой указатель удалять можно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2011, 07:57     деструктор
Еще ссылки по теме:

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

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

деструктор по умолчанию - C++
Всем привет. Хотелось бы обсудить такой код: class A { }; class B: virtual public A { }; class C: public virtual A

Не работает деструктор - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using std::cout; #pragma hdrstop #pragma argsused class vect { public: vect(int...

конструктор и деструктор - C++
Почему деструктор не вызывается? #include &lt;iostream.h&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; class myclass{ float a; ...


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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.04.2011, 07:57     деструктор #11
Цитата Сообщение от Mr.X Посмотреть сообщение
Эта проверка излишняя, так как нулевой указатель удалять можно.
*т.к. эта проверка происходит внутри delete

Цитата Сообщение от gGrn-7DA Посмотреть сообщение
a->~A();//надо ли это?
delete a;
Деструктор будет вызван для разрушения объекта перед освобождением памяти. Вручную вызывать не нужно, только delete.
Yandex
Объявления
04.04.2011, 07:57     деструктор
Ответ Создать тему
Опции темы

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