|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
09.04.2009, 16:38 | #1 |
Регистрация: 09.04.2009
Сообщений: 4
|
Полиморфизм и выделение (освобождение) памяти
Пишу код типа:
В h-файле: Код:
Код:
В прикладном файле-клиенте на стеке порождается ряд объектов типа B. При первом вызове деструктора ~A() операция delete выполняется нормально, а следующий вызов приводит к Access Violation, т.к. delete обращается к уже удаленной при первом вызове переменной element. Собственно вопрос: в чем причина ошибки? Ведь вызов конструктора базового класса происходит опросредованно через вызов конструктора производного класса B(), значит, по идее, и деструктор должен вызываться для соответствующего объекта. При попытке перенести new и delete для element в соответственно конструктор и деструктор производного класса, оставив объявление в базовом, имею аналогичную картину. Последний раз редактировалось MaTBeu; 09.04.2009 в 19:21. |
09.04.2009, 17:40 | #2 | ||
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Цитата:
Цитата:
Код:
|
||
09.04.2009, 22:09 | #3 |
Регистрация: 09.04.2009
Сообщений: 4
|
|
09.04.2009, 22:18 | #4 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Разве не Ваши слова, что удаляется второй раз одно и то же? Код в студию как именно создаёте объект, как именно удаляете, а то мало ли что там у Вас и как происходит...
|
09.04.2009, 22:35 | #5 |
Регистрация: 09.04.2009
Сообщений: 4
|
Под рукой не имею, какую-либо новизну к тому, что объекты порождаются на стеке, это вряд ли добавит. В debuggere видно, что при конструировании каждого последующего объекта производного класса память в конструкторе базового класса выделяется по разным адресам. Почему же тогда в момент удаления объекта производного класса при вызове деструктора базового класса производится попытка освободить уже освобожденную память?
|
10.04.2009, 00:54 | #6 |
Новичок
Джуниор
Регистрация: 30.03.2009
Сообщений: 1
|
насколько я помню, если в базовом классе есть виртуальные функции то и диструктор у базового класса должен быть виртуальным...
Последний раз редактировалось Bogus Jr.; 10.04.2009 в 01:15. |
11.04.2009, 04:00 | #7 |
Новичок
Джуниор
Регистрация: 07.04.2009
Сообщений: 2
|
|
11.04.2009, 04:59 | #8 | |
Пользователь
Регистрация: 18.03.2009
Сообщений: 89
|
Цитата:
Код:
Scogan, по поводу основного вопроса - можешь привести более полный код происходящего? Наверняка там какая-нибудь путаница, которую на словах фиг поймешь. |
|
11.04.2009, 11:25 | #9 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Может там конструктор копирования вызывается неявно. Явно конструктор не задан и потому будет поэлементное копирование и разные объекты будут указывать на один и тот же element. В общем код в студию
|
13.04.2009, 07:57 | #10 |
Регистрация: 09.04.2009
Сообщений: 4
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Освобождение памяти | AlexandrSid | Общие вопросы Delphi | 3 | 02.02.2009 13:45 |
Освобождение Памяти в Си | volotsky | Помощь студентам | 2 | 16.12.2008 22:36 |
До выделение памяти | MAKTE | Общие вопросы C/C++ | 4 | 20.05.2008 21:34 |
Выделение памяти | antoha.by | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 29.04.2008 20:04 |
выделение оперативной памяти | Alar | Общие вопросы Delphi | 0 | 29.10.2006 21:56 |