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

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

Войти
Регистрация
Восстановить пароль
 
 
Fasterbru
5 / 5 / 2
Регистрация: 18.11.2014
Сообщений: 81
#1

Деструктор класса. Удаление динамически выделенного массива в классе - C++

17.05.2015, 22:46. Просмотров 719. Ответов 21
Метки нет (Все метки)

First.h
C++
1
2
3
4
5
6
7
8
9
class First
{
private:
    int* num;
    int n;
public:
    First(int a);
    ~First();
};
First.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "First.h"
 
First::First(int a)
{
    n = a;
    num = new int[a];
}
 
First::~First()
{
    delete[n] num;
}
0
Миниатюры
Деструктор класса. Удаление динамически выделенного массива в классе  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2015, 22:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Деструктор класса. Удаление динамически выделенного массива в классе (C++):

Удаление динамического массива в классе - C++
при удаление динамического массива в классе зависает программа... хотя в инете нашел кучу примеров, где написано точно также.... :cry: ...

Конструктор и деструктор в классе - C++
Решил разобраться в конструкторах и деструкторах. Написал, вроде по такой же структуре как и в учебнике. А комп выдает ошибки в компиляции,...

Ругается на деструктор (выделял динамически память). Почему? - C++
Вот код: #include <stdio.h> #include <conio.h> #include <time.h> #include <stdlib.h> class MClass { private: int...

Удаление из массива элементов класса - C++
пытаюсь разобраться с классами, но особо не получается..да и вечное "скорее сдать" не особо оставляет время для того, чтобы понять все до...

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

деструктор класса - C++
Здравствуйте! Я скопировал код отсюда https://msdn.microsoft.com/ru-ru/library/6t4fe76c.aspx себе в Visual Studio 2015, после...

21
hoggy
6768 / 2953 / 509
Регистрация: 15.11.2014
Сообщений: 6,655
Завершенные тесты: 1
17.05.2015, 23:29 #16
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Fasterbru Посмотреть сообщение
nt main()
{
* * First perem(10);
* * perem.~First();
system("pause");
}
ну это жесть вообще.
для настоящих ценителей.

лекарство:

заменить:

C++
1
2
3
4
First::~First()
{
    delete[n] num;
}
на:

C++
1
2
3
4
5
First::~First()
{
    delete[n] num;
    num = nullptr;
}
правда за такое лекарство убивать нужно.
потому что UB, а значит никаких гарантий.
скорее всего работать будет.
но теоретически бабахнуть может в любой момент.

настоящее лекарство - престрелить нафиг того программиста,
который столь необдуманно в ручную дергает деструктор.
1
Fasterbru
5 / 5 / 2
Регистрация: 18.11.2014
Сообщений: 81
17.05.2015, 23:29  [ТС] #17
lss, почему?
0
lss
922 / 851 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
17.05.2015, 23:30 #18
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если хочешь проверить работу деструктора, помести создание объекта в {}, тогда при выходе из этой области сработает деструктор.
1
hoggy
6768 / 2953 / 509
Регистрация: 15.11.2014
Сообщений: 6,655
Завершенные тесты: 1
17.05.2015, 23:31 #19
Цитата Сообщение от lss Посмотреть сообщение
Это UB.
это не UB.


более того - деструктор можно звать руками не просто так.
у этого есть применение.
целые иодемы и техники программирования доступны лишь благодаря такой возможности.

(см boost::optional, например)


А UB это:

C++
1
2
    {First perem(10);
    perem.~First(); }
0
lss
922 / 851 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
17.05.2015, 23:36 #20
Цитата Сообщение от Fasterbru Посмотреть сообщение
lss, почему?
Потому, что он второй раз вызовется при выходе из программы (когда будет уничтожаться объект), а память уже освобождена.

Добавлено через 43 секунды
Цитата Сообщение от hoggy Посмотреть сообщение
более того - деструктор можно звать руками не просто так.
Написал:
Цитата Сообщение от lss Посмотреть сообщение
Не нужно здесь
Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
на:
C++
1
2
3
4
5
First::~First()
{
* * delete[n] num;
* * num = nullptr;
}
Это как? Что освобождаем?

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
А UB это:

C++
1
2
* * {First perem(10);
* * perem.~First(); }
А в коде у ТС разве не так? Скобки можно раздвинуть до границ main().
0
hoggy
6768 / 2953 / 509
Регистрация: 15.11.2014
Сообщений: 6,655
Завершенные тесты: 1
17.05.2015, 23:39 #21
Цитата Сообщение от lss Посмотреть сообщение
Это как? Что освобождаем?
копипаста.

имел ввиду вот это:

C++
1
2
3
4
5
First::~First()
{
    delete[] num;
    num = nullptr;
}
Цитата Сообщение от lss Посмотреть сообщение
А в коде у ТС разве не так?
в коде у ТС UB.

но вы выделили не весь достаточный для понимания контекст кода ТС,
а лишь отдельно взятую строчку: ручной вызов деструктора.

как будто бы ручной вызов деструктора - уже UB, само по себе.
1
DrOffset
7471 / 4467 / 1015
Регистрация: 30.01.2014
Сообщений: 7,322
17.05.2015, 23:42 #22
lss, он имел в виду, что сам по себе вызов деструктора явно - это не UB (для этого есть оправданные применения).
UB - это повторный вызов деструктора при выходе из области видимости, вследствие явного вызова оного до этого.
Поэтому он процитировал контекст, вместо одной строчки.
Хотя, я убежден, что ты имел в виду абсолютно тоже самое.
2
17.05.2015, 23:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2015, 23:42
Привет! Вот еще темы с ответами:

Деструктор класса - C++
Имеется собственный класс, возник вопрос, деструктор класса вызывается не явно ? если так, то в какой момент он вызывается ?

У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? - C++
#include <windows.h> #include <iostream> using namespace std; //Вот главный класс class A{ public: A (){}; class...

Деструктор класса список - C++
Доброго времени суток. Создал класс односвязный список. Не знаю как сделать деструктор таким, чтобы он удалял все элементы списка. В том...

Деструктор абстрактного класса - C++
Почему деструктор абстрактного класса нужно делать виртуальным?


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

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