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

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

Войти
Регистрация
Восстановить пароль
 
Mihai
8 / 8 / 0
Регистрация: 19.12.2010
Сообщений: 26
#1

Полиморфизм и освобождение памяти - C++

03.11.2011, 11:16. Просмотров 408. Ответов 6
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
class A{    // базовый класс
...
};
 
class B : public A{    // унаследованный от класса A
...
};
далее в программе:
B *b = new B;
A *a = dynamic_cast<A*>(b);

можно ли освободить память через указатель а?
то есть написать:
C++
1
delete a;
а не:
C++
1
delete b;
а также при более сложном (множественном) наследовании без разницы к какому базовому классу приведен указатель, память должна освободиться корректно, я прав или нет?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
03.11.2011, 11:43     Полиморфизм и освобождение памяти #2
модернизированный пример:

Код
class A
{
public:
    A(){cout<<"A()"<<endl;}
    ~A(){cout<<"~A()"<<endl;}
};

class B : public A
{
    char *a;
public:
    B()
    {
        cout<<"B()"<<endl;
        a = new char[1024];
        cout<<"a = new char[1024];"<<endl;
    }
    ~B()
    {
        cout<<"~B()"<<endl;
        delete[] a;
        cout<<"delete[] a;"<<endl;
    }
};

int main (void)
{
    B *b = new B();
    A *a = dynamic_cast<A*>(b);
    delete a;

    return 0;
}
вывод:
A()
B()
a = new char[1024];
~A()
удаления данных в B нету - утечка
Mihai
8 / 8 / 0
Регистрация: 19.12.2010
Сообщений: 26
03.11.2011, 12:10  [ТС]     Полиморфизм и освобождение памяти #3
есть такое дело... спасибо. ну вот и первая загвоздочка...
поискал в Инете. нашёл, что вроде как можно её попробовать побороть прописав ключевое слово virtual для деструктора.
Хотелось бы верить, что больше других проблем с памятью не возникнет.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.11.2011, 12:19     Полиморфизм и освобождение памяти #4
Цитата Сообщение от Mihai Посмотреть сообщение
вроде как можно её попробовать побороть прописав ключевое слово virtual для деструктора.
Для деструктора базового класса.

далее в программе:
B *b = new B;
A *a = dynamic_cast<A*>(b);
Равнозначно записи
B *b = new B;
A *a = b;
Mihai
8 / 8 / 0
Регистрация: 19.12.2010
Сообщений: 26
03.11.2011, 12:44  [ТС]     Полиморфизм и освобождение памяти #5
Цитата Сообщение от Deviaphan Посмотреть сообщение
Равнозначно записи
B *b = new B;
A *a = b;
да. действительно... спасибо.
Насколько я понимаю dynamic_cast хорошо если бы мы не были уверены можно ли осуществить данное приведение типа (например, при работе с переданным в функцию указателем). Тогда просто получим NULL, если окажется, что связи не существует.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.11.2011, 12:52     Полиморфизм и освобождение памяти #6
Цитата Сообщение от Mihai Посмотреть сообщение
Насколько я понимаю
C++
1
2
3
4
5
6
7
// class B : public A;
A * a;
B * b;
 
a = b;
// Но!
b = dynamic_cast<B*>(a);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2011, 13:02     Полиморфизм и освобождение памяти
Еще ссылки по теме:

Освобождение участка памяти C++
C++ Выделение и освобождение памяти
C++ Освобождение динамической памяти в vs
Освобождение памяти C++
C++ Освобождение памяти

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

Или воспользуйтесь поиском по форуму:
Mihai
8 / 8 / 0
Регистрация: 19.12.2010
Сообщений: 26
03.11.2011, 13:02  [ТС]     Полиморфизм и освобождение памяти #7
да. действительно... и в этом случае тоже

возвращаясь к своему первому вопросу:
Цитата Сообщение от Mihai Посмотреть сообщение
а также при более сложном (множественном) наследовании без разницы к какому базовому классу приведен указатель, память должна освободиться корректно, я прав или нет?
делаю вывод, что ответ положительный, если для всех базовых классов прописан виртуальный деструктор.
Yandex
Объявления
03.11.2011, 13:02     Полиморфизм и освобождение памяти
Ответ Создать тему
Опции темы

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