Re[4]: Нельзя определить размер динам. массива, хотя delete[
От: Bell Россия  
Дата: 22.02.06 13:50
Оценка:
Здравствуйте, Яшин Евгений, Вы писали:


ЯЕ>Хорошо, т.е. вы хотите сказать, что вот в таком коде


ЯЕ>
ЯЕ>class C
ЯЕ>{
ЯЕ>    int v;
ЯЕ>    ~C(){}
ЯЕ>};

ЯЕ>void f()
ЯЕ>{
ЯЕ>    C* ptr = new C[100];
ЯЕ>    delete[] (int*)ptr;
ЯЕ>}
ЯЕ>


ЯЕ>компилятор просто не сможет правильно вычислить адрес начала "сырой" выделеной памяти и, попросту говоря, всё хлопнеться?

VC7.1 — AV.

ЯЕ>А вы сможете подтвердить такое поведение пунктом стандарта?

Да хоть вот это:
5.3.5/3
...In the second alternative (delete array) if the dynamic type of the
object to be deleted differs from its static type, the behavior is undefined

Динамический тип операнда — C*, а статический — int* — имеем неопределенное поведение.

ЗЫ
Быть может будет интересно еще кое-что о delete []
Автор:
Дата: 30.11.05
Любите книгу — источник знаний (с) М.Горький
Re[4]: Нельзя определить размер динам. массива, хотя delete[
От: Андрей Тарасевич Беларусь  
Дата: 22.02.06 15:04
Оценка:
Здравствуйте, Яшин Евгений, Вы писали:

ЯЕ>Хорошо, т.е. вы хотите сказать, что вот в таком коде


ЯЕ>
ЯЕ>class C
ЯЕ>{
ЯЕ>    int v;
ЯЕ>    ~C(){}
ЯЕ>};

ЯЕ>void f()
ЯЕ>{
ЯЕ>    C* ptr = new C[100];
ЯЕ>    delete[] (int*)ptr;
ЯЕ>}
ЯЕ>


ЯЕ>компилятор просто не сможет правильно вычислить адрес начала "сырой" выделеной памяти и, попросту говоря, всё хлопнеться?


Да, компилятор, который не хранит второй размер для типа 'int', но хранит для типа 'C', действительно не сможет правильно вычислить этот адрес в данном случае со всеми вытекающими.

ЯЕ>А вы сможете подтвердить такое поведение пунктом стандарта?


5.3.5/3: Если динамический тип объекта, указуемого аргументом 'delete[]', отличается от его статческого типа — поведение не определено.
Best regards,
Андрей Тарасевич
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.