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

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

Восстановить пароль Регистрация
 
Mihai
7 / 7 / 0
Регистрация: 19.12.2010
Сообщений: 26
03.11.2011, 11:16     полиморфизм и освобождение памяти #1
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;
а также при более сложном (множественном) наследовании без разницы к какому базовому классу приведен указатель, память должна освободиться корректно, я прав или нет?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2011, 11:16     полиморфизм и освобождение памяти
Посмотрите здесь:

C++ Освобождение памяти
C++ Освобождение памяти
резервирование памяти/освобождение памяти для трехмерного массива C++
Освобождение памяти C++
C++ освобождение памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
oxotnik
 Аватар для oxotnik
1584 / 1061 / 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
7 / 7 / 0
Регистрация: 19.12.2010
Сообщений: 26
03.11.2011, 12:10  [ТС]     полиморфизм и освобождение памяти #3
есть такое дело... спасибо. ну вот и первая загвоздочка...
поискал в Инете. нашёл, что вроде как можно её попробовать побороть прописав ключевое слово virtual для деструктора.
Хотелось бы верить, что больше других проблем с памятью не возникнет.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 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
7 / 7 / 0
Регистрация: 19.12.2010
Сообщений: 26
03.11.2011, 12:44  [ТС]     полиморфизм и освобождение памяти #5
Цитата Сообщение от Deviaphan Посмотреть сообщение
Равнозначно записи
B *b = new B;
A *a = b;
да. действительно... спасибо.
Насколько я понимаю dynamic_cast хорошо если бы мы не были уверены можно ли осуществить данное приведение типа (например, при работе с переданным в функцию указателем). Тогда просто получим NULL, если окажется, что связи не существует.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 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++
Освобождение памяти C++

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

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

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

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