Re[3]: Operator delete[]
От: Erop Россия  
Дата: 19.09.07 13:25
Оценка:
Здравствуйте, Owen, Вы писали:

V>>удаляется объект размером с B?

O>Так здесь понятно, что по деструктору определяет, а вот массив не имеет деструктора...
А как он определяет, что это B, а не A?
Деструктор-то не виртуальный

Вообще-то читай внимателеьнее что тебе пишут таки...
Тебе уже всё объяснили очень подробно и довольно квалифицированно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Operator delete[]
От: Аноним  
Дата: 19.09.07 17:13
Оценка:
Здравствуйте, Owen, Вы писали:

O>Здравствуйте, Awaken, Вы писали:


O>>>Сори за тупой вопрос. Как он опредиляет длину удаляемого участка памяти?


A>>по дескриптору занятого блока.

A>>как именно организованы эти дескрипторы, зависит от реализации,
A>>но скорее всего он находится с минусовым смещением от адреса занимаемого объектом

O> У ты дал. Деструктор находится там где любая функция... Если виртуальный то его адрес в таблице виртуальных функций, если нет, то его компилятор знает где искать.

O>Я имел в виду длину вектора удаляемого, а не размер самого обьекта

деструктор != дескриптор
Re[4]: Operator delete[]
От: Пётр Седов Россия  
Дата: 20.09.07 22:09
Оценка: +1
Здравствуйте, CreatorCray, Вы писали:
CC>void delete [] (TYPE *ptr)
CC>{
CC>    int *iPtr = (int*)ptr;
CC>    int number = *(--iPtr);
CC>    TYPE *tPtr = (TYPE*)ptr;

CC>    for (int i=0;i<number;i++)
CC>        вызов деструктора для tPtr[i];

CC>    free (iPtr);
CC>}

Насколько я знаю, деструкторы вызываются в обратном порядке.
Пётр Седов (ушёл с RSDN)
Re[4]: Operator delete[]
От: Erop Россия  
Дата: 20.09.07 23:56
Оценка: +1
Здравствуйте, CreatorCray, Вы писали:

CC>В VC7.1 new [] и delete[] работает примерно так:

CC>псевдокоТ


Только тут надо заметить, что псевдокод приведён для описания того кода, который генерирует компилятор на месте конструкции new[] и delete[].

а operator new[] и operator delete[] только выделяют и освобождают память, то есть в псевдокоде надо было вызывать не free, например, а operator delete[]...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Operator delete[]
От: CreatorCray  
Дата: 21.09.07 06:38
Оценка: +1
Здравствуйте, Пётр Седов, Вы писали:

ПС>Насколько я знаю, деструкторы вызываются в обратном порядке.

Пардон, упустил этот момент.
Вот он вред копипаста! Скопировал из того кода, что написал для new[] и не обратил внимания.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.