Кто-нибудь может объясненить, почему следующий код компилируется
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 врёт?
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* это указатель на неизменяемый объект
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.
Первое можно перегрузить, последнее — нет, т.к. последнее не является ф-цией.
Здравствуйте, Аноним, Вы писали:
А>Константный у тебя не объект, А>а указатель на него. А>Вот его ты изменить и не можешь, а сам объект — запросто
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 ).
А>Попробуйте побавить к классу 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>
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, ошибочно утверждал