Освобождение указателей на абстрактные классы - PullRequest
1 голос
/ 30 июня 2011

В C ++ у меня есть class A, в котором есть указатель абстрактного класса для учета полиморфизма, содержащегося в class B, у меня есть еще один указатель на абстрактный class C, который выделяет конкретный экземпляр дочернего класса class B в эту память, и мне нужно вызвать функцию очистки (см. вопрос ниже) из class C, чтобы освободить память, занятую дочерним классом class B, который я выделил из кучи, проблема в том, что я не могу гарантировать, что я Я имею доступ к функции очистки, потому что у меня есть только указатель на class C, который я не могу просто скопировать, потому что он может исчезнуть к тому времени, когда я вызову необходимость уничтожить содержащую class A.

Чтобы решить проблему отсутствия доступа к функции очистки, я могу вызвать delete для указателя class A, даже если я указываю на дочерний класс? Сохраняет ли новый C ++ также размер блока кучи, например, malloc, так что вы можете просто удалить память, на которую ссылается указатель на абстрактный класс, подобный этому? Если нет, существует ли другой способ организации программы, позволяющий мне обрабатывать ситуация?

Ответы [ 2 ]

6 голосов
/ 30 июня 2011

Я использую свой хрустальный шар, потому что трудно ответить на ваш вопрос, но вам, вероятно, нужны виртуальные деструкторы.

4 голосов
/ 30 июня 2011

Стандартные состояния (§5.3.5 ¶3):

В первом варианте ( удалить объект ), если статический тип операнда отличается от егодинамический тип, статический тип должен быть базовым классом динамического типа операнда, а статический тип должен иметь виртуальный деструктор или поведение не определено.

Если я правильно понял, у вас есть объектнекоторый производный тип, и вы держите указатель на него, чей статический тип является одним из его базовых классов;Итак, вы в порядке, если у вас есть virtual деструкторов.


Редактировать хорошо, я был слишком медленным: P

...