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

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

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

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

03.11.2011, 11:16. Просмотров 434. Ответов 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;
а также при более сложном (множественном) наследовании без разницы к какому базовому классу приведен указатель, память должна освободиться корректно, я прав или нет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2011, 11:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Полиморфизм и освобождение памяти (C++):

резервирование памяти/освобождение памяти для трехмерного массива - C++
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...

Освобождение памяти - C++
Добрый день. Пишу в рубрику &quot;Вопросы начинающих по С/С++&quot; посему вопрос глупый :) И все же, есть такой код //offset - массив...

Освобождение памяти - C++
Есть многопоточное приложение. Создается глобальная структура: Пример из msdn. typedef struct _MyData { int val1; ...

Освобождение памяти - C++
Товарищи,недавно баловался в Microsoft VS,готовился к экзаменам,писал небольшие програмки с использованием динамических массивов.Память под...

Освобождение памяти - C++
Собственно есть простенький класс class Human { public: Human ( ); void ptintHuman(); private: static long...

Освобождение памяти - C++
Есть класс дроби с перегруженным оператором приведения к char * Fraction::operator char*() { char num=&quot;&quot;; char denom=&quot;&quot;; ...

6
oxotnik
1591 / 1068 / 33
Регистрация: 21.08.2008
Сообщений: 4,464
Записей в блоге: 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 нету - утечка
1
Mihai
8 / 8 / 0
Регистрация: 19.12.2010
Сообщений: 26
03.11.2011, 12:10  [ТС] #3
есть такое дело... спасибо. ну вот и первая загвоздочка...
поискал в Инете. нашёл, что вроде как можно её попробовать побороть прописав ключевое слово virtual для деструктора.
Хотелось бы верить, что больше других проблем с памятью не возникнет.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 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;
1
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, если окажется, что связи не существует.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 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);
0
Mihai
8 / 8 / 0
Регистрация: 19.12.2010
Сообщений: 26
03.11.2011, 13:02  [ТС] #7
да. действительно... и в этом случае тоже

возвращаясь к своему первому вопросу:
Цитата Сообщение от Mihai Посмотреть сообщение
а также при более сложном (множественном) наследовании без разницы к какому базовому классу приведен указатель, память должна освободиться корректно, я прав или нет?
делаю вывод, что ответ положительный, если для всех базовых классов прописан виртуальный деструктор.
0
03.11.2011, 13:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2011, 13:02
Привет! Вот еще темы с ответами:

Освобождение памяти - C++
Есть класс, в котором я выделяю память с помощью new. В деструкторе класса я с помощью delete освобождаю память, но у меня вылетает ошибка...

Освобождение памяти - C++
#include&lt;iostream&gt; #include&lt;cstring&gt; using namespace std; struct stringy{ char * str; int ct; }; stringy &amp; set(stringy &amp;...

Освобождение памяти в c++ - C++
Привет, помогите разобраться с освобождением памяти в c++. Я так понимаю, что если освободить память, то переменная удаляется, но почему же...

Освобождение памяти - C++
Как сделать, чтобы при вызове деструктора экземпляра i класса image, вызвался и деструктор класса image_bmp? class image { public:...


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

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

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