Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: указатели
Показать сообщение отдельно
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Если ещё интересно про A a(123) и for_each(delete):

В С/C++ все выражения принимаются в виде lvalue = rvalue (левому присвоить правое). lvalue должна иметь адрес в памяти, rvalue - значение. Формально A a = A(123) значит {A a; a=A(123)}, то есть по синтаксису используется A& operator=(...), который возвращает rvalue. Конструкции, где используется значение, например if (...), требуют rvalue, а конструкция объявления переменных A a(123) не является rvalue (это lvalue). Подобно этому, {A b(124), a=A(123)} - тоже не может быть приведена к rvalue. Между тем, компиляторам рекомендуется делать оптимизацию, уменьшающую количество копирований, даже если имеются побочные эффекты присваивания, копирования и разрушения объектов. На синтаксисе это не сказалось.

Я проверил, что делает for_each(begin, end, operator delete) на предмет повреждения памяти. Оказалось, что здесь шаблон for_each(Iterator, Iterator, Transform) раскрывается как for_each(vector<A*>::iterator, vector<A*>::iterator, operator delete(void*)), То есть освобождение памяти есть, а вызова деструктора - нет (даже если он виртуальный).

Тесты проводились в том числе на GCC 3.3.2.

Отправлено: 11:32, 26-12-2005 | #8

Название темы: указатели