Удаление константных объектов
От: Аноним  
Дата: 06.12.05 15:15
Оценка:
Здравствуйте,

Кто-нибудь может объясненить, почему следующий код компилируется

class cClass
{
};

int main(int argc, char* argv[])
{
const cClass* obj = new cClass;
delete obj;

return 0;
}

(как VC++ .NET, так и gcc 3.2 компиляторами) несмотря на следующее утверждение (MSDN, статья 'delete Operator'):

Pointers to const objects cannot be deallocated with the delete operator.

?
Я понимаю, что если запретить удаление динамически созданного константного объекта (без грязных трюков с явным преобразованием типов и использования const_cast), это тоже будет плохо, и все же...

Хотя в стандарте С++ (пункт 5.3.5.2) говорится, что все корректно юна, MSDN врёт?
Re: Удаление константных объектов
От: Lorenzo_LAMAS  
Дата: 06.12.05 15:20
Оценка:
А>Хотя в стандарте С++ (пункт 5.3.5.2) говорится, что все корректно юна, MSDN врёт?

Если есть VC 6.0, то можно убедиться, что для него не врет.


int main()
{
   const int * p = new const int(10);
   delete p;
}


d:\test\main.cpp(3) : error C2468: 'new' : cannot allocate 'const'/'volatile' objects (type is 'const int')
d:\test\main.cpp(4) : error C2664: 'delete' : cannot convert parameter 1 from 'const int *' to 'void *'

Of course, the code must be complete enough to compile and link.
Re: Удаление константных объектов
От: MaximE Великобритания  
Дата: 06.12.05 15:28
Оценка:
On Tue, 06 Dec 2005 15:15:30 -0000, Аноним <0@users.rsdn.ru> wrote:

> Кто-нибудь может объясненить, почему следующий код компилируется

>
> class cClass
> {
> };
>
> int main(int argc, char* argv[])
> {
> const cClass* obj = new cClass;
> delete obj;
>
> return 0;
> }
>
> (как VC++ .NET, так и gcc 3.2 компиляторами) несмотря на следующее утверждение (MSDN, статья 'delete Operator'):
>
> Pointers to const objects cannot be deallocated with the delete operator.
>
> ?
> Я понимаю, что если запретить удаление динамически созданного константного объекта (без грязных трюков с явным преобразованием типов и использования const_cast), это тоже будет плохо, и все же...

delete statement и operator delete — разные вещи. MSDN говорит про оператор, у тебя в коде statement.

operator delete в твоем коде выглядел бы так:

::operator delete(obj);


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re[2]: Удаление константных объектов
От: Аноним  
Дата: 06.12.05 15:37
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>On Tue, 06 Dec 2005 15:15:30 -0000, Аноним <0@users.rsdn.ru> wrote:


>> Кто-нибудь может объясненить, почему следующий код компилируется

>>
>> class cClass
>> {
>> };
>>
>> int main(int argc, char* argv[])
>> {
>> const cClass* obj = new cClass;
>> delete obj;
>>
>> return 0;
>> }
>>
>> (как VC++ .NET, так и gcc 3.2 компиляторами) несмотря на следующее утверждение (MSDN, статья 'delete Operator'):
>>
>> Pointers to const objects cannot be deallocated with the delete operator.
>>
>> ?
>> Я понимаю, что если запретить удаление динамически созданного константного объекта (без грязных трюков с явным преобразованием типов и использования const_cast), это тоже будет плохо, и все же...

ME>delete statement и operator delete — разные вещи. MSDN говорит про оператор, у тебя в коде statement.


ME>operator delete в твоем коде выглядел бы так:


ME>
ME>::operator delete(obj);
ME>


ME>--

ME>Maxim Yegorushkin
что такое delete statement в С++, новая конструкция? То, что Вы называете operator delete, это operator delete function, которая просто чистит ранее выделенную в куче память. Деструктор класса она не зовет, в отличие от operator delete.
Re: Удаление константных объектов
От: Аноним  
Дата: 06.12.05 15:40
Оценка:
Константный у тебя не объект,
а указатель на него.
Вот его ты изменить и не можешь, а сам объект — запросто
Re[2]: Удаление константных объектов
От: Аноним  
Дата: 06.12.05 15:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Константный у тебя не объект,

А>а указатель на него.
А>Вот его ты изменить и не можешь, а сам объект — запросто
Сие не есть правда. Константный указатель объявляется следующим образом

cClass *const p; // неизменный указатель на вполне изменяемый класс
const cClass* p; // = cClass const* это указатель на неизменяемый объект
Re[3]: Удаление константных объектов
От: MaximE Великобритания  
Дата: 06.12.05 15:47
Оценка: +1
On Tue, 06 Dec 2005 15:37:07 -0000, Аноним <0@users.rsdn.ru> wrote:

[]

> что такое delete statement в С++, новая конструкция?


delete statement это ключевое слово delete за которым следует указатель.

То, что Вы называете operator delete, это operator delete function, которая просто чистит ранее выделенную в куче память. Деструктор класса она не зовет, в отличие от operator delete.

operator delete, как и остальные операторы в С++, есть ф-ция. Задача этой ф-ции освободить память; то же самое, что и free().
delete statement же — не ф-ция, но синтаксическая конструкция языка, которая сначала вызывает деструктор объекта, затем operator delete.
Первое можно перегрузить, последнее — нет, т.к. последнее не является ф-цией.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re[2]: Удаление константных объектов
От: Greg Zubankov СССР  
Дата: 06.12.05 15:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Константный у тебя не объект,

А>а указатель на него.
А>Вот его ты изменить и не можешь, а сам объект — запросто

const cClass* obj = new cClass;


Неправда Ваша. obj это указатель на константный объект. Сам указатель как раз можно изменять.


Константный указатель объявляется так:
cClass* const obj = new cClass;
Re[3]: Удаление константных объектов
От: Аноним  
Дата: 06.12.05 16:06
Оценка:
Здравствуйте, Greg Zubankov, Вы писали:

GZ>Здравствуйте, Аноним, Вы писали:


А>>Константный у тебя не объект,

А>>а указатель на него.
А>>Вот его ты изменить и не можешь, а сам объект — запросто

GZ>
GZ>const cClass* obj = new cClass;
GZ>


GZ>Неправда Ваша. obj это указатель на константный объект. Сам указатель как раз можно изменять.



GZ>Константный указатель объявляется так:

GZ>
GZ>cClass* const obj = new cClass;
GZ>

Попробуйте побавить к классу cClass не константную функцию, вызов которой значение указателя никак изменить не может. Вы не сможете ее вызвать относительно obj, т.к. это указатель на константный объект.
Re[3]: Удаление константных объектов
От: Аноним  
Дата: 06.12.05 16:10
Оценка:
Здравствуйте, Greg Zubankov, Вы писали:

GZ>Здравствуйте, Аноним, Вы писали:


А>>Константный у тебя не объект,

А>>а указатель на него.
А>>Вот его ты изменить и не можешь, а сам объект — запросто

GZ>
GZ>const cClass* obj = new cClass;
GZ>


GZ>Неправда Ваша. obj это указатель на константный объект. Сам указатель как раз можно изменять.



GZ>Константный указатель объявляется так:

GZ>
GZ>cClass* const obj = new cClass;
GZ>

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

const cClass* obj = ...

Вы утверждаете, что это константный указатель?
Re[4]: Удаление константных объектов
От: Аноним  
Дата: 06.12.05 16:17
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>On Tue, 06 Dec 2005 15:37:07 -0000, Аноним <0@users.rsdn.ru> wrote:


ME>[]


>> что такое delete statement в С++, новая конструкция?


ME>delete statement это ключевое слово delete за которым следует указатель.


ME>То, что Вы называете operator delete, это operator delete function, которая просто чистит ранее выделенную в куче память. Деструктор класса она не зовет, в отличие от operator delete.


ME>operator delete, как и остальные операторы в С++, есть ф-ция. Задача этой ф-ции освободить память; то же самое, что и free().

ME>delete statement же — не ф-ция, но синтаксическая конструкция языка, которая сначала вызывает деструктор объекта, затем operator delete.
ME>Первое можно перегрузить, последнее — нет, т.к. последнее не является ф-цией.

ME>--

ME>Maxim Yegorushkin

Что же Вы правы, спасибо (правда в стандарте delete statement называют delete expression ).
Re[4]: Удаление константных объектов
От: Greg Zubankov СССР  
Дата: 06.12.05 16:17
Оценка:
Здравствуйте, Аноним, Вы писали:


GZ>>Константный указатель объявляется так:

GZ>>
GZ>>cClass* const obj = new cClass;
GZ>>

А>Попробуйте побавить к классу cClass не константную функцию, вызов которой значение указателя никак изменить не может. Вы не сможете ее вызвать относительно obj, т.к. это указатель на константный объект.

Бред. Разберитесь указателями.

const cClass* obj = new cClass; // указатель на константный объект
cClass const* obj = new cClass; // указатель на константный объект
cClass* const obj = new cClass; // константный указатель
const cClass* const obj = new cClass; // константный указатель на константный объект
Re[5]: Удаление константных объектов
От: Аноним  
Дата: 06.12.05 16:20
Оценка:
Здравствуйте, Greg Zubankov, Вы писали:
См. пост 3(2)
GZ>Здравствуйте, Аноним, Вы писали:


GZ>>>Константный указатель объявляется так:

GZ>>>
GZ>>>cClass* const obj = new cClass;
GZ>>>

А>>Попробуйте побавить к классу cClass не константную функцию, вызов которой значение указателя никак изменить не может. Вы не сможете ее вызвать относительно obj, т.к. это указатель на константный объект.

GZ>Бред. Разберитесь указателями.


GZ>
GZ>const cClass* obj = new cClass; // указатель на константный объект
GZ>cClass const* obj = new cClass; // указатель на константный объект
GZ>cClass* const obj = new cClass; // константный указатель
GZ>const cClass* const obj = new cClass; // константный указатель на константный объект
GZ>
Re[5]: Удаление константных объектов
От: MaximE Великобритания  
Дата: 06.12.05 16:20
Оценка:
On Tue, 06 Dec 2005 16:17:11 -0000, Аноним <0@users.rsdn.ru> wrote:

[]

> (правда в стандарте delete statement называют delete expression ).


Попутал немного.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re[6]: Удаление константных объектов
От: Аноним  
Дата: 06.12.05 17:54
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>On Tue, 06 Dec 2005 16:17:11 -0000, Аноним <0@users.rsdn.ru> wrote:


ME>[]


>> (правда в стандарте delete statement называют delete expression ).


ME>Попутал немного.


ME>--

ME>Maxim Yegorushkin

И все-таки ...

delete Operator, как он описан в одноименной статье MSDN, соответствует как раз delete expression. Оперетор delete, как функция (перекружаемая), так и называется operator delete function. Утверждение о невозможности удаления по указателю на константный объект приводится в описании delete operator'а (=delete expression). Так что, MSDN все же гонит
Re[4]: Удаление константных объектов
От: Аноним  
Дата: 06.12.05 21:37
Оценка:
Здравствуйте, Аноним, Вы писали:

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


Ты споишь не с тем.
Это я (аноним), а не Greg Zubankov, ошибочно утверждал
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.