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

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

Восстановить пароль Регистрация
 
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
30.12.2013, 12:06     виртуальный деструтор #1
нужно ли вообще деструктор класса делать виртуальным?

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++ Деструтор взял выходной.
C++ Виртуальный конструктор копировщик.
Виртуальный деструктор C++
C++ Виртуальный конструктор
C++ виртуальный деструктор
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
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
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
30.12.2013, 12:28     виртуальный деструтор #4
Цитата Сообщение от noname_club Посмотреть сообщение
нужно ли вообще деструктор класса делать виртуальным?
если класс может иметь наследников, то да. Это нужно для корректного удаления объекта.

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

Текущее время: 10:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru