Деструкторы вызываться не будут. Компилятор не имеет ни малейшего представления о том, что у тебя p указывает на что-то, для чего вообще существуют деструкторы.
Более того, работать с этим указателем тоже будет затруднительно — методы, операторы и т.д вызвать не полукится.
Утечек памяти вероятно нет оттого, что конструкторы динамически не выделяют память и простое освобождение памяти объекта достаточно.
P.S. Стиль отвратительный.
А>Допустим есть такой код: А>
А>void* p = new CString;
<...>>
А>delete p;
А>p = new CMyCoolClass;
<...>>
А>delete p;
А>
А>Будут ли вызываться деструкторы в этом случае? Нажимая Ф11 я этого не заметил, однако утечек памяти тоже нет.
Здравствуйте, Аноним, Вы писали:
А>Допустим есть такой код: А>
А>void* p = new CString;
<...>>
А>delete p;
А>p = new CMyCoolClass;
<...>>
А>delete p;
А>
А>Будут ли вызываться деструкторы в этом случае?
Нет, не будут А>Нажимая Ф11 я этого не заметил, однако утечек памяти тоже нет.
А ты присвой своей строке какое-нибудь значение.
Более того, в данном случае поведение вообще не определено:
5.3.5/3
In the first alternative (delete object), if the static type of the operand is different
from its dynamic type, the static type shall be a base class of the operand’s dynamic
type and the static type shall have a virtual destructor or the behavior is undefined.
Любите книгу — источник знаний (с) М.Горький
Re[2]: delete
От:
Аноним
Дата:
27.11.03 11:40
Оценка:
V>P.S. Стиль отвратительный.
Придумай лучше. Любые предложения будут с благодарностью рассмотрены.
Для синтаксического разбора методом рекурсивного спуска имеется структура:
Она описывает текущий терм: переменную или результат операции над ними. Переменные могут быть числовыми (double), строковыми (CString) и графиками. (Это довольно сложная структура, поэтому не будем вдаваться в подробности.)
В процессе разбора тип терма может измениться. Например, если после переменной типа "график" стоит команда получения его имени, то терм превращается в строку и дальше он рассматривается как строковая переменная. Поэтому нельзя сделать для терма базовый класс и несколько производных — как положено согласно "святому писанию".
А держать в структуре несколько указателей не хотелось бы. Поэтому возникла идея сделать один общий указатель.
Здравствуйте, Аноним, Вы писали:
V>>P.S. Стиль отвратительный.
А>Придумай лучше. Любые предложения будут с благодарностью рассмотрены.
А>Для синтаксического разбора методом рекурсивного спуска имеется структура: А>
(Конструкторы и деструкторы опущены)
А>Она описывает текущий терм: переменную или результат операции над ними. Переменные могут быть числовыми (double), строковыми (CString) и графиками. (Это довольно сложная структура, поэтому не будем вдаваться в подробности.)
А>В процессе разбора тип терма может измениться. Например, если после переменной типа "график" стоит команда получения его имени, то терм превращается в строку и дальше он рассматривается как строковая переменная. Поэтому нельзя сделать для терма базовый класс и несколько производных — как положено согласно "святому писанию".
А>А держать в структуре несколько указателей не хотелось бы. Поэтому возникла идея сделать один общий указатель.
А>А у вас какие идеи?
Здравствуйте, Аноним, Вы писали:
А>Никто не знает, что будет происходить в этом случае. Неопределенное поведение, однако.
Да, да! Саттер даже пишет, что "компилятор может вставить здесь код, форматирующий Ваш винчестер"
Re[6]: delete
От:
Аноним
Дата:
27.11.03 13:30
Оценка:
__>>>Может объединение сделать ?
А>>Может. Но это тоже не кошерно.
__>А почему ?
Не знаю. Но так говорят Знатоки Стандарта и Почитатели Страуструпа. А еще они не любят void*
Я-то наверное оставлю все как было, потому как экономить память здесь ни к чему. Но мне стало интересно, а как в таком случае поступают "правильные программисты"?
Re[5]: delete
От:
Аноним
Дата:
27.11.03 13:31
Оценка:
Здравствуйте, Аноним, Вы писали:
[] А>Хотел так. Но при удалении деструкторы действительно не вызываются. Хотелось бы узнать кошерное решение.
__>>>>Может объединение сделать ?
А>>>Может. Но это тоже не кошерно.
__>>А почему ?
А>Не знаю. Но так говорят Знатоки Стандарта и Почитатели Страуструпа.
Да нет, объединение само по себе не трефное. Плохо, когда пишут в один член объединения, а читают из другого (a-la hibyte-lowbyte). А в "законном" использовании ничего плохого нет. А>А еще они не любят void*
А за что его любить? Для нашей же пользы С++ — строго типизированный язык. А ты отказываешься от руки помощи компилятора .
Здравствуйте, Вы писали:
> Придумай лучше. Любые предложения будут с благодарностью рассмотрены.
> Для синтаксического разбора методом рекурсивного спуска имеется структура: >
Здравствуйте, <Аноним>, Вы писали:
V>>P.S. Стиль отвратительный.
А>Придумай лучше. Любые предложения будут с благодарностью рассмотрены.
А>Для синтаксического разбора методом рекурсивного спуска имеется структура: А>
(Конструкторы и деструкторы опущены)
А>Она описывает текущий терм: переменную или результат операции над ними. Переменные могут быть числовыми (double), строковыми (CString) и графиками. (Это довольно сложная структура, поэтому не будем вдаваться в подробности.) А>В процессе разбора тип терма может измениться. Например, если после переменной типа "график" стоит команда получения его имени, то терм превращается в строку и дальше он рассматривается как строковая переменная. Поэтому нельзя сделать для терма базовый класс и несколько производных — как положено согласно "святому писанию".
А>А держать в структуре несколько указателей не хотелось бы. Поэтому возникла идея сделать один общий указатель.
А>А у вас какие идеи?
Идея полиморфного терма не очень удачна. У вас, я полагаю, есть набор функций-композиторов, которые принимают значения вполне определённых типов и возвращают результат вполне определённого типа.
Вроде
Здравствуйте, Аноним, Вы писали:
V>>P.S. Стиль отвратительный.
А>Она описывает текущий терм: переменную или результат операции над ними. Переменные могут быть числовыми (double), строковыми (CString) и графиками. (Это довольно сложная структура, поэтому не будем вдаваться в подробности.)
А>В процессе разбора тип терма может измениться. Например, если после переменной типа "график" стоит команда получения его имени, то терм превращается в строку и дальше он рассматривается как строковая переменная. Поэтому нельзя сделать для терма базовый класс и несколько производных — как положено согласно "святому писанию".
А>А держать в структуре несколько указателей не хотелось бы. Поэтому возникла идея сделать один общий указатель.
А зачем менять тип терма? Согласно "святому писанию" переменная типа "график" и результат выполнения "команда получения его имени" суть два разных терма.
> то терм превращается в строку и дальше он рассматривается как строковая переменная.
Для этого достаточно завести _новый_ терм типа "строка".