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

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

Войти
Регистрация
Восстановить пароль
 
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
#1

виртуальный деструтор - C++

30.12.2013, 12:06. Просмотров 263. Ответов 4
Метки нет (Все метки)

нужно ли вообще деструктор класса делать виртуальным?

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
class base_class1 {
public:
    base_class1() {
        data = new char[50];
        sprintf(data, "hello world");
    };
    ~base_class1() {
        cout << "~base_class1 free " << data << " " << endl;
        delete [] data;
    };
    
    char * data ;
    
};
 
class base_class2: public base_class1 {
public:
    base_class2() {
        data2 = new char[50];
        sprintf(data2, "hello world2");
    };
    ~base_class2() {
        cout << "~base_class2 free " << data2 << " " << endl;
        delete [] data2;
    };
    
    char *data2;
 
};
и теже самые классы с виртуальными деструкторами

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
class base_class1 {
public:
    base_class1() {
        data = new char[50];
        sprintf(data, "hello world");
    };
    virtual ~base_class1() {
        cout << "~base_class1 free " << data << " " << endl;
        delete [] data;
    };
    
    char * data ;
    
};
 
class base_class2: public base_class1 {
public:
    base_class2() {
        data2 = new char[50];
        sprintf(data2, "hello world2");
    };
    virtual ~base_class2() {
        cout << "~base_class2 free " << data2 << " " << endl;
        delete [] data2;
    };
    
    char *data2;
 
};
код программы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include "myclasses.h"
 
int main(int argc, const char * argv[])
{
 
    
    base_class2 *c2 = new base_class2();
    
    delete c2;
 
    return 0;
}
ответ консоли в обоих случаях

~base_class2 free hello world2
~base_class1 free hello world
Program ended with exit code: 0
То есть наличие слова virtual не влияет на деструктор вообще?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.12.2013, 12:06     виртуальный деструтор
Посмотрите здесь:

Деструтор взял выходной. - C++
Уважаемые знатаки, доброго времени суток. В процессе написания лабы захотелось одну функцию протестировать отделно от всего осталного. ...

Виртуальный operator() - C++
Есть такая иерархия классов. class Network { ...... }; class Server : public Network

Виртуальный деструктор - C++
Всем привет! Объясните пожалуйста новичку в ООП, вопрос чисто теоретический поэтому код не прилагаю. Мне сказали что если я в классе...

Виртуальный метод - C++
class A { virtual void Print()=0; } class B : public A { virtual void Print() { //Печатаем в...

виртуальный деструктор - C++
есть такой пример, у меня вопрос, почему здесь деструктор декларирован просто как деструктор, а не виртуальный (и является ли он в данном...

Виртуальный конструктор - C++
Подскажите, к каких случаях необходимо использовать виртуальный конструктор, и что это такое??

Виртуальный метод - C++
Здравствуйте! Помогите, пожалуйста, найти ошибку в коде. #include &quot;stdafx.h&quot; class Person{ protected: char *name; ...

Виртуальный базовый класс - C++
Создать иерархию типов, описывающую - человека, студента, отца семейства и студента-отца семейства. Использовать виртуальные базовые...

виртуальный табличный указатель - C++
виртуальным табличным указателем vptr (указатель на таблицу виртуальных методов класса, которому принадлежит объект) является указатель p...

Виртуальный абстрактный класс - C++
Надеюсь мой вопрос будет не глупым. Есть класс исключений в пространстве имен std У него есть метод what Я создаю свой базовый класс...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
30.12.2013, 12:13     виртуальный деструтор #2
noname_club, Вы неправильно их готовите. Измените-ка main на

C++
1
2
3
4
5
6
int main(int argc, const char * argv[])
{
    base_class1 *c2 = new base_class2();
    delete c2; 
    return 0;
}
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
30.12.2013, 12:22  [ТС]     виртуальный деструтор #3
int main(int argc, const char * argv[])
{
base_class1 *c2 = new base_class2();
delete c2;
return 0;
}
ответ консоли:

в случае с виртуальным деструктором

~base_class2 free hello world2
~base_class1 free hello world
Program ended with exit code: 0
в случае невиртуального деструктора

~base_class1 free hello world
Program ended with exit code: 0
то есть экземпляр объекта base_class2 был удален не полностью и вызвал утечку памяти, в случае невиртуального деструктора

это означает, что деструктор нужно всегда делать виртуальным, иначе велика вероятность вот такого неполного удаления
MrGluck
Модератор
Эксперт CЭксперт С++
6984 / 4155 / 592
Регистрация: 29.11.2010
Сообщений: 11,021
30.12.2013, 12:28     виртуальный деструтор #4
Цитата Сообщение от noname_club Посмотреть сообщение
нужно ли вообще деструктор класса делать виртуальным?
если класс может иметь наследников, то да. Это нужно для корректного удаления объекта.

Для обычных классов лучше методы и деструктор виртуальными не делать.
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
30.12.2013, 12:29     виртуальный деструтор #5
noname_club, Именно так. Если предполагается полифорфное использование - деструктор должен быть виртуальным.
Yandex
Объявления
30.12.2013, 12:29     виртуальный деструтор
Ответ Создать тему
Опции темы

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